Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

Math.random

で気になったので. ばらつきは上記のページで試してみるとして.
まず, ES5thのMath.randomはimplementation-dependentです.

15.8.2.14 random ()
Returns a Number value with positive sign, greater than or equal to 0 but less than 1, chosen randomly or pseudo randomly with approximately uniform distribution over that range, using an implementation-dependent algorithm or strategy. This function takes no arguments.

Annotated ES5 section15.8.2.14 random()

当然, 「で, じゃあ実際何使ってるの?」っていうのが気になります. この資料はいうまでもなく2010/10/06現在のものです.

SpiderMonkey

みんな大好きSpiderMonkey, これの
http://hg.mozilla.org/tracemonkey/file/8a9195da5fb3/js/src/jsmath.cpp#l484
をみると,

Math.random() support, lifted from java.util.Random.java

えっ. ということで見てみると, 確かに.
java.util: Random.java
で, これは48bit線形合同法です.
Oracle Technology Network for Java Developers
LCGとしては素晴らしいそうですが. いろいろと問題があるようで,
良い乱数・悪い乱数

V8

V8のMath.randomはmath.jsをみると, C++関数のRuntime_RandomHeapNumberを呼びます.
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/math.js#167
で, これはNativeCodeになったときにinlineな関数になるので,
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/runtime.h#410
例えば, ia32のcodeをみてみれば,
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/ia32/codegen-ia32.cc?r=5595#7089
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/ia32/codegen-ia32.cc?r=5595#7108
で, 実質ExternalReference::random_uint32_functionを呼んでいるので, 見てみれば,
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/assembler.cc?r=5595#586
なので, V8::Randomが呼ばれています. やっと本体. 大変ですね.
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/v8.cc?r=5595#175

Random number generator using George Marsaglia's MWC algorithm.

ということで, MWC, キャリー付き乗算 - Wikipedia です.

JSC

さて次っ! JSCはbuiltin objectはruntime以下にあると想定して探したら早速.
http://trac.webkit.org/browser/trunk/JavaScriptCore/runtime/MathObject.cpp?rev=69191#L214
で, じゃあGlobalにもってるのかー(各々Contextごとにseedを保持する必要があるので)ということで, weakRandomNumberへ.
http://trac.webkit.org/browser/trunk/JavaScriptCore/runtime/JSGlobalObject.h?rev=69191#L295
WeakRandom instanceの初期化はJSGlobalObjectDataのconstructorがやっていました. で, WeakRandom.
http://trac.webkit.org/browser/trunk/JavaScriptCore/runtime/WeakRandom.h?rev=69191#L295
線形合同法とは違います. Ian BulliardさんのGameRandです.
Squarespace - Account Not Available 高速らしいですよ.

まとめ

さすがにrand関数そのまま渡しているアレゲEngineは存在しなかった.
あと, 後で見つけたのですが, こちらで考察されています.
Yet another substitute for Math.random - comp.lang.javascript | Google Groups
個人的にはXorshiftとかやってるEngineあるかと思ってたけど, なかったです.

Remove all ads