seed 上位1bitの話

を読んで。
二つのseedの上位1bit以外が一致している場合 row(PID) xor high(PID) って常に一致するんだなー。今までPIDのbit15 xor bit31が一致すればいいから50%だと思いこんでた。

x=0〜0x7fffffff
1つ目の乱数でPID下位16bitが決定、2つ目の乱数でPID上位16bitが決定される。

seed = x のとき、rowの上位1bitは0。
seed = (x | 0x80000000) のとき、rowの上位1bitは1。

next(x)の上位1bitが1のとき、next(x | 0x80000000)の上位1bitは常に0、
next(x)の上位1bitが0のとき、next(x | 0x80000000)の上位1bitは常に1である。

なぜならば
next(x | 0x80000000) = next(x) + uint32(0x80000000 * 0x41c64e6d)
だから。
この式を変形すると next(x | 0x80000000) = next(x) xor 0x80000000 となる。
(0x80000000足すのは0x80000000とxorをとるのと同じ)

よって xと(x | 0x80000000)で(rowの上位1bit xor highの上位1bit)は常に一致する。

追記 (2010-04-29T18:48:14+09:00)

ってこれ後から考えてみると当たり前だなー。
もしこれが成り立たなかったら、上位1bitが違うだけの2つのseedそれぞれの次のseedが同じになるってことが起こってしまう。

筆者: oupo (連絡先: oupo.nejiki@gmail.com)