地図/信号/ノイズとゆらぎ

種をまく — 同じ乱数列を呼び戻す

Math.random は、いま出た列を二度と再現できない。気に入った絵やメロディが出ても、もう一回出すことができない。状態を自分で持って整数演算でかき混ぜる乱数なら、種(seed)を一つ決めるだけで、そこから出る列はいつも同じになる。

mulberry32。状態が32ビット整数1個だけの、小さな疑似乱数。Math.imul は32ビット整数の掛け算(オーバーフローを切り捨てる)で、ビットシフトと XOR を組み合わせて入力のビットを満遍なくかき混ぜるハッシュになる。暗号用途には弱いが、生成アートやゲームの「同じ種から同じ世界」には足りる。Math.random と違って状態が外から見えるので、URL に種を焼けば作品の住所になる。

mulberry32(seed) は整数の状態 a を持つ関数を返す。呼ぶたびに a に定数を足し、imul とビットシフトで撹拌して 0〜1 を返す。同じ種で2本の乱数を走らせると、出る値が一粒ずつ一致する。下は上から、種 42 の列を暗い点で、同じ種 42 の二本目を明るい点で、種 43 の列を暗い点で打つ。明るい点が左から右へ走るカーソルでなぞられる。

上2段は種が同じ 42 なので、明るい点が暗い点の真上に乗って、カーソルが通っても二つがずれない。3段目だけ種が 43 で、別の高さに散る。やっているのは整数を imul とビットシフトで撹拌するだけで、新しい数学はない。状態を持つ純粋な関数で、種を保存すれば同じゆらぎを後から呼び戻せる。Math.randommulberry32(seed)() に差し替えれば、乱数を使う絵や音はそのまま再現可能になる。