スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

線形合同法

初期シードが変わったらその後の乱数は大きく違ったものになるだろうなぁ、と思っていたらそうでもなかった。

以下、断らない限り合同式の法は0x100000000.
異なる初期シードs[0]=s,s'[0]=s+δを持つ乱数のシードの列s[n],s'[n]について、次の漸化式が成り立つ。

s[n+1]≡a*s[n]+b
s'[n+1]≡a*s'[n]+b
ただし、a=0x41C64E6D,b=0x6073.

これにより、

s'[n+1]-s[n+1]≡a(s'[n]-s[n]).
∴s'[n]-s[n]≡a^n*(s'[0]-s[0])=δ*a^n.

このことから、たとえばδ=2,n=3のときには

s'[3]-s[3]≡0xfb796a

となって、r[n]=s[n]/0x10000(余りは切り捨て)のように定義される乱数列r[n],r'[n]について

r'[3]-r[3]≡0xfb mod 0x10000

となり、乱数の値の差が比較的小さい。野生ポケモンの性格は2chの乱数解析スレによると乱数を0xa3eで割ったものということなので、δが2の倍数で比較的小さいなら、2つの乱数から作られる性格は一致する。これが該当スレで議論されていた起動後初めての野生ポケモンの性格の偏りの原因ですね。

線形合同法使うならこんなことが起きないようにちゃんと考えないと駄目ですね。そもそも乱数列が解析されるとは思っていなかったでしょうが。
スポンサーサイト
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。