初期Seedの上位2桁と徘徊位置の関係

当たり前の話だけどうまく説明できない話。


初期Seed 0x00000000の時
00回目,0x00000000 → rand=0x0000 → rand%16=0
01回目,0x00006073 → rand=0x0000 → rand%16=0
02回目,0xE97E7B6A → rand=0xE97E → rand%16=E
03回目,0x52713895 → rand=0x5271 → rand%16=1
04回目,0x31B0DDE4 → rand=0x31B0 → rand%16=0


初期Seed 0x01000000の時
00回目,0x01000000 → rand=0x0100 → rand%16=0
01回目,0x6D006073 → rand=0x6D00 → rand%16=0
02回目,0x527E7B6A → rand=0x527E → rand%16=E
03回目,0x07713895 → rand=0x0771 → rand%16=1
04回目,0x42B0DDE4 → rand=0x42B0 → rand%16=0


初期Seed 0xFF000000の時
00回目,0xFF000000 → rand=0xFF00 → rand%16=0
01回目,0x93006073 → rand=0x9300 → rand%16=0
02回目,0x807E7B6A → rand=0x807E → rand%16=E
03回目,0x9D713895 → rand=0x9D71 → rand%16=1
04回目,0x20B0DDE4 → rand=0x20B0 → rand%16=0


初期Seedの上2桁がどんなに変わろうとも、
残りの下6桁が同じ値であれば、以降のSeedにおいても
下6桁は同一になる。
これは次のSeedを
NewSeed = (Seed × 0x41C64E6D + 0x6073) & 0xFFFFFFFF
の式(つまり一次式)で計算しているため、当然の結果。
現在の乱数は上位4桁だから、現在乱数の下2桁は
Seedの3,4桁目に相当することになり、同一になる。
従って、それを16(=0x10)で割った余りも同一になる。


当然ながら25(=0x19)で割った余りは同一にならないので、
ラティを残すのは非常に有用。