randomを比べてみる。
SFMTを含んでいるため、修正BSDライセンスです。
SFMTについては、260行目あたりを参照。
本当は↓からforkにしたかったけど、
http://wonderfl.kayac.com/code/feb94dc51f5dfdeb1aeef3d16b35c70661e6b963
ライセンス的にダメだったので方向転換。
◆Math.random()と線形合同法とSFMTの三つを
を比較してみた。
それぞれを実行時間(sec)を計るために100万回実行し、
また、取り出した値の偏りを視覚的に確認するために、
40万の点の座標をx,yで作り、画像に埋めていった。
計算結果に偏りがある場合はムラやパターン、筋が現れるはず。
結果
MacOSX10.5.7/2.4GHzCore2Duo、FlashPlayer10,0,22,87では
0.587sec:Math.random
0.037sec:線形合同法
0.515sec:SFMT
確認画像では、三つともほぼ同じ程度のムラとなった。
結論
これくらいのムラは実用上問題ない。
・Math.randomについて
特に偏りがひどいとかは無いような。
・線形合同法について
randomSeedを与えられる、計算が速いという理由で
今回作った線形合同法が良いかも。
・SFMTについて
SFMTは今回くらいのテスト内容だと、
特にメリットが見いだせなかった。
それとも実装の問題なのだろうか、、、。
=====
最近、アルゴリズムの本を読んで気になっていたので、
random()を調べてみた。
コンピュータでは通常、完全にランダムな
値を作ることはできない。
実用上問題無いくらいにバラバラの値を
上手い計算方法で取り出して使っている。
これを疑似乱数(pseudo-random number)
という。
疑似乱数の計算方法はいくつも提案されているが、
その中でも特に使われているのは、
線形合同法のようだ。
ただし、線形合同法は設定値の組み合わせによって、
振る舞いが変わる。言語によってバラバラなので、
結果、良い線形合同法と悪い線形合同法が
できてしまっている。注意が必要だ。
また、疑似乱数では再現可能なしくみ、
乱数の種(randomSeed)を与えることができる。
疑似乱数はあくまでも計算結果なた
- forked:1
- favorite:6
- lines:250
- license : see code comments
- modified : 2009-06-08 12:58:20


