【TC39 Proposals】Math.seededRandoms()


注意書き

2019 年 10 月 9 日に開催の #tc39_study 用に作成した資料です。
執筆時点で TC39 の Proposals に上がっている機能を紹介します。
将来的に JavaScript(ECMAScript)に取り入れられるかもしれませんし、取り入れられないかもしれませんし、紹介内容から仕様が大きく変更になるかもしれません。
TC39 の承認プロセスについては、https://tc39.es/process-document/ をご覧ください。


Math.seededRandoms()

従来の Math.random()window.crypto.getRandomValues() は乱数種の設定をすることができず、乱数種の制御が必要な場合は外部ライブラリ等を使用する必要がありました。
本 Proposal は、乱数種の設定ができる擬似乱数生成器(PRNG; Pseudo Random Number Generator)を導入します。
単体テストや実験などで再現性のある乱数列が必要な場面で役立ちます。
また、以下の乱数を使ったHoudiniのデモで、実行毎に結果が異なる問題を解消することができます。
https://css-houdini.rocks/rough-boxes/

本記事の執筆時点で Stage 1 です。


使い方

core-jsのPolyfillが使えないため、コードは spec からの引用です。


PRNGの作成と乱数生成

Math.seededPRNG({ seed }) によってPRNGオブジェクトを作成します。
seed プロパティを持ったオブジェクトを引数に与えることで乱数種を設定します。
長いビット長の乱数種を必要とする乱数生成アルゴリズムが採用されたら、seed はNumberではなくなる可能性もあります。

PRNGオブジェクトの random() メソッドを呼び出すことで擬似乱数を生成します。

const prng = Math.seededPRNG({seed:0});
for(let i = 0; i < limit; i++) {
  const r = prng.random();
  // do something with each value
}

PRNGの複製

seed getterによって、PRNGの現在の state を得ることができます。
state をseedとして新しいPRNGに渡すことで、PRNGの複製ができます。
以下の例では、複製した clone と元の prng が同じ擬似乱数を返すことが示されています。

const prng = Math.seededPRNG({seed:0});
for(let i = 0; i < 10; i++) prng.random(); // advance the state a bit
const clone = Math.seededPRNG({seed:prng.seed});
// prng.random() === clone.random()

seed getterを持つので、PRNGの複製は以下のようにも書くことができます。

const prng = Math.seededPRNG({seed:0});
const clone = Math.seededPRNG(prng);
// prng.random() === clone.random()

サブPRNGの作成

一つの乱数列を複数の用途に使う場合の制御を簡単にするために、サブPRNGを生成できます。
サブPRNGはPRNGオブジェクトの randomSeed() メソッドを使います。

const parent = Math.seededPRNG({seed:0});
const child1 = Math.seededPRNG({seed:parent.randomSeed()});
const child2 = Math.seededPRNG({seed:parent.randomSeed()});
// child1.random() != child2.random()

その他

  • ユーザーの環境(ブラウザやNode.js、それらのバージョン)に依存せずに同一の乱数列になるように検討されています
    • このProposalではアルゴリズムは変更できず、一意に決められる必要があります
    • 生成速度と乱数の性質のバランスを考慮してアルゴリズムが検討されています
  • PRNGオブジェクトをIteratorに対応することが検討されています

Polyfill

core-js内にあるものは2018年1月時点の仕様であり、上記の仕様と大きく異なります。


所感

科学技術計算やコンピュータグラフィックスであると便利なやつ。
ただ、まだ検討事項が多くてStageが進むのは遅いかも。


参考情報