Math.randomとcrypto.getRandomValues

Math.randomとcrypto.getRandomValuesの違い、乱数を範囲に収めるときに生じる剰余バイアス、シードを指定できる乱数の作り方を解説します。

Math.randomの性質

0以上1未満の疑似乱数を返しますが、シードを指定できず、予測も可能です。シミュレーションには十分でも、トークンやパスワードの生成には向きません。

暗号用の乱数と剰余バイアス

crypto.getRandomValuesは暗号用途にも使える乱数です。ただし、乱数を単純にnで割った余りにすると、2の32乗がnで割り切れない場合に偏りが出ます。範囲外の値を捨てて引き直す方法で避けられます。

再現できる乱数

結果を再現したいときは、シードを指定できるmulberry32のような小さな疑似乱数を自作します。同じシードなら同じ結果になるので、テストや検証に使えます。

この技術を使っているツール