多次元疎密乱数

提供:MonoBook
2026年5月21日 (木) 10:33時点におけるAdministrator (トーク | 投稿記録)による版 (→‎状態を作り出す)

多次元疎密乱数とは、あえて性能の悪い、または意図的に細工した「線形合同法」などの古い乱数アルゴリズムの総称です。これらは多次元空間にプロットした際、値が綺麗に分散せず、格子状の「縞模様(偏り)」ができます。

仕組み

前回の乱数値をベースに特定の乗数と足し算を行うだけの単純な計算式にする。

演出

乱数の周期の中に「連続して大当たりの値が出現するエリア」と「全く出ないエリア」がグラデーションのように存在することになります。プレイヤーがボタンを押すタイミング(時間をシードにする場合など)によって、その「大当たりの塊のエリア」に突入すると、怒涛の連チャンが発生します。

実装例: Z80

下位8bit(Lレジスタ)の値をそのまま大当たりの判定に使うと、「特定の数が出たあと、数回後にまた同じ数が極端に出やすくなる」という周期的な偏り(格子構造の欠陥)が発生します。1990年代の保留玉連チャン機(数珠連機)のロジシックに一番近い実装です。

;---------------------------------------------------
; 16bit 線形合同法 (X = X * 5 + 1)
; 入力: なし
; 出力: HLレジスタ = 16bit乱数 (下位8bitのLレジスタを抽選に使用)
;---------------------------------------------------
NEXT_LCG:
    LD   HL, (RAND_SEED_16) ; HL = 前回値 X
    LD   D, H
    LD   E, L               ; DE = X

    ; HL = X * 5 を乗算命令なしで計算 (X * 4 + X)
    ADD  HL, HL             ; HL = X * 2
    ADD  HL, HL             ; HL = X * 4
    ADD  HL, DE             ; HL = X * 4 + X  (つまり X * 5)

    ; + 1 を行う
    INC  HL                 ; HL = X * 5 + 1

    LD   (RAND_SEED_16), HL ; 次回のために保存
    LD   A, L               ; 下位8bitをAレジスタに取り出す
    RET

実装例: C#

乗数5、加数1の16ビット線形合同法です。下位8ビット(ushort から byte へのキャスト)を取り出すことで、実機さながらの「周期的な偏り(数珠連)」が発生します。

public class LcgRandom
{
    private ushort _seed16;

    public LcgRandom(ushort initialSeed = 4649)
    {
        _seed16 = initialSeed;
    }

    /// <summary>
    /// 16bit 線形合同法 (X = X * 5 + 1)
    /// </summary>
    public byte Next()
    {
        unchecked
        {
            // HL = X * 5 + 1 (Z80の ADD HL,HL を再現)
            _seed16 = (ushort)(_seed16 * 5 + 1);
            
            // 下位8bit(Lレジスタに相当)を返す
            return (byte)(_seed16 & 0xFF);
        }
    }
}

状態を作り出す

「ボタンを押した瞬間のタイマー値(VBLANKカウンターなど)」をシードにするゲームであればゲーム性は以下のようになります。

地獄モード(ハマり)

プレイヤーがレバーを叩くタイミングが乱数周期内の「全く出ないエリア(256個のうちの特定の区間)」に同期してしまっている状態。

天国モード(連チャン)

タイマーの進み方とプレイヤーのレバーを叩く周期が「大当たりの塊エリア」に見事に噛み合った状態。一度突入すると、レバーを叩くタイミングが少しズレてもまだ「塊の中」にいるため怒涛の連チャン(確変のような挙動)が体感として発生します。

当時の開発者が意図してこの偏り(味)を残したのか、16bitの限界による偶然の産物だったのかは分かりませんが、現代の綺麗すぎる一様乱数にはない「波の荒さ」「ギャンブル性の高さ」を演出するには最高のロジックです。