メインコンテンツまでスキップ

乱数

乱数生成処理はメモリ上の 0x009643 に存在している。単純なLFSRやLCGではない模様。

状態を3byte (0x7E0ED70x7E0ED9) 、生成された乱数を1byte (0x7E0ED5) 保持している。 初期値 (つまりシード) は 0x7E0ED50x7FFFFF の値が、それ以外には 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 を参照のこと。