8

この Stack Overflow スレッドによると、JavaScript の Math.random() はブラウザーまたはオペレーティング システムに依存します。基本的に、JavaScript には一様確率変数を生成するための標準アルゴリズムがないことを意味します。このスレッドは、Chrome の一様乱数アルゴリズムが特に悪いことを示唆しているようです。

私のプログラムでは、いくつかの情報とランダムなノイズに基づいて、ユーザーの行動を理解しようとしています。Math.random() によって生成された数値に対して Box-Muller 変換を使用して、ガウス乱数を生成します。これは、あるブラウザを使用しているユーザーが他のブラウザとは異なる種類のノイズを経験するということですか? 速度は気にしないので Box Muller を使用しますが、疑似乱数の生成方法に特に敏感になる可能性があることはわかっています。Math.random() が悪い理由については多くのスレッドがあるようですが、代わりに実際に何を使用するかについてはスレッド内にはあまりありません。ベストプラクティスは何ですか? Box-Muller を使用してガウス数に変換しているため、特に注意すべき点はありますか?

4

2 に答える 2

1

Box-Muller変換は、一様に分散された入力に対してのみ機能します。MDN (最後の例) によると、Math.random()均一に分散された数値は生成されません。

ECMAScript 仕様では、 について次のように述べていますMath.random()

実装依存のアルゴリズムまたは戦略を使用して、0 以上 1 未満の正符号を持つ Number 値を返しますこの関数は引数を取りません。

したがって、それはブラウザ次第です。ブラウザーは、完全に一様に分散された乱数ジェネレーターを実装する場合がありますが、実装する必要はありません。

したがって、ブラウザー側で Javascript を使用してクロスブラウザーの Box-Muller 変換を確実に実装することはできません。Math.random()

于 2013-10-22T14:18:17.843 に答える