「多次元疎密乱数」の版間の差分
Administrator (トーク | 投稿記録) 編集の要約なし |
Administrator (トーク | 投稿記録) |
||
| 66行目: | 66行目: | ||
; 地獄モード(ハマり) | ; 地獄モード(ハマり) | ||
プレイヤーがレバーを叩くタイミングが乱数周期内の「全く出ないエリア(256個のうちの特定の区間)」に同期してしまっている状態。 | |||
; 天国モード(連チャン) | ; 天国モード(連チャン) | ||
タイマーの進み方とプレイヤーのレバーを叩く周期が「大当たりの塊エリア」に見事に噛み合った状態。一度突入すると、レバーを叩くタイミングが少しズレてもまだ「塊の中」にいるため、怒涛の連チャン(確変のような挙動)が体感として発生します。 | |||
当時の開発者が意図してこの偏り(味)を残したのか、16bitの限界による偶然の産物だったのかは分かりませんが、現代の綺麗すぎる一様乱数にはない「波の荒さ」「ギャンブル性の高さ」を演出するには最高のロジックです。 | 当時の開発者が意図してこの偏り(味)を残したのか、16bitの限界による偶然の産物だったのかは分かりませんが、現代の綺麗すぎる一様乱数にはない「波の荒さ」「ギャンブル性の高さ」を演出するには最高のロジックです。 | ||
[[category: 疑似乱数]] | [[category: 疑似乱数]] | ||
2026年5月21日 (木) 10:32時点における版
多次元疎密乱数とは、あえて性能の悪い、または意図的に細工した「線形合同法」などの古い乱数アルゴリズムの総称です。これらは多次元空間にプロットした際、値が綺麗に分散せず、格子状の「縞模様(偏り)」ができます。
仕組み
前回の乱数値をベースに特定の乗数と足し算を行うだけの単純な計算式にする。
演出
乱数の周期の中に「連続して大当たりの値が出現するエリア」と「全く出ないエリア」がグラデーションのように存在することになります。プレイヤーがボタンを押すタイミング(時間をシードにする場合など)によって、その「大当たりの塊のエリア」に突入すると、怒涛の連チャンが発生します。
実装例: 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の限界による偶然の産物だったのかは分かりませんが、現代の綺麗すぎる一様乱数にはない「波の荒さ」「ギャンブル性の高さ」を演出するには最高のロジックです。