しびら

技術ネタのメモとか。

Google Chrome 49で正しい乱数が返ってくるようになった模様

   

random

Math.random()関数は0~1の間の少数を含む値をランダムに返します。V8含むJavascriptエンジンでは擬似乱数数ジェネレータ(PRNG)を使ってMath.random()を実装しています。

擬似乱数とは、乱数のように見えて、実際には計算によって求めている、規則性や再現性がある乱数のことです。擬似乱数が本物の乱数と(統計的に見て)見分けが付かない状態だと質の良い擬似乱数であると言えます。

最近までV8エンジンは擬似乱数ジェネレータとしてMWC1616(multiply with carry, combining two 16-bit parts)と言われるアルゴリズムを使用していました。githubにあるコードは以下のようです。

このアルゴリズムに問題があり、実際に出力するとBeforeの画像のような規則が見える、乱数っぽくない出力となっていたようです。

random

V8エンジンが修正され、現在はXorShift128関数によるランダムが採用されたようです。

そしてこの修正はChrome 49で反映されたようです。

Google Chrome’s JavaScript engine finally returns actual random numbers

他のJavascriptエンジンとの乱数比較するとおもしろそうですね。

 

 - Javascript , ,