私は JavaJava.util.Random()
を JavaScript に移植するタスクを与えられましたが、Javascript で十分に大きな数値に対してビット単位の演算子を使用すると、パフォーマンスが大幅に低下したり、不正確になったりすることに遭遇しました。いくつかのざっくりとした調査では、「JavaScript のビット演算子は本質的に遅い」と述べられています。これは、内部的に JavaScript がすべての double 値を符号付き 32 ビット整数にキャストしてビット演算を実行するように見えるためです (詳細については、こちらを参照してください)。これでは、Java 乱数ジェネレーターを直接移植することはできませんJava.util.Random()
。のようなものを書く
this.next = function(bits) {
if (!bits) {
bits = 48;
}
this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1);
return this.seed >>> (48 - bits);
};
( Java.util.Random()
Javascript はそのサイズの整数に対してビット単位の操作を実行できないため、コードは正しく動作しません)。
Lehmer アルゴリズムを使用して 32 ビット空間でシード可能な乱数ジェネレーターを作成できることがわかりましたが、秘訣は、 の場合と同じ値を取得する必要があることですJava.util.Random()
。より高速で機能的な移植を行うにはどうすればよいですか?