乱数
乱数生成処理はメモリ上の 0x009643
に存在している。単純なLFSRやLCGではない模様。
状態を3byte (0x7E0ED7
〜 0x7E0ED9
) 、生成された乱数を1byte (0x7E0ED5
) 保持している。
初期値 (つまりシード) は 0x7E0ED5
に 0x7FFFFF
の値が、それ以外には 0x00
が設定される。
scalaでの再現実装は以下のようになる (以下の d5
が新規に生成される乱数)。
type Prng = State[(Int, Int, Int, Int), Int]
def prng: Prng = State(state0 => {
val (d50, d70, d80, d90) = state0
val p = d70 & 0x03
val init = p == 0x00 || p == 0x03
val state =
(for {
d9 <- rol(d90)
d7 <- rol(d70)
q <- adc(d7, 0x22)
r <- adc(q, d9)
d8 <- adc(r ^ 0x5A, d80)
d5 = d8 ^ d50
} yield {
(d5, d7, d8, d9)
}).runA(init).value
(state, state._1)
})
完全なコードは scripts/prng.sc を参照のこと。