wonderfl - build flash online

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)を与えることができる。
疑似乱数はあくまでも計算結果なた

umhr umhr

add to favorites

Embed

Code Fullscreen

Favorite by

Tags

sectKeywords

Forked

ページの先頭へ戻る