乱数を使用してあれこれという場面は結構ありますが、質がどうなのかのチェックはしていなかったと思い、ちょっとテストした結果です。
比較にはLinux標準のglibcに含まれるrand()と Mersenne Twisterと呼ばれる手法によるgenrand_real1()を利用して一様乱数を発生させてどんな感じなのかを調べます。ちなみにMersenne Twisterは非常に質が良いとされている最近出てきた乱数生成手法。
ただヒストグラムを取っても面白くないので、モンテカルロ法で円周率を計算させてみます。
プログラム自体は単純なので省略。各10億(109)点(20億組)から円周率を計算することを1000回繰り返すので、1兆(1012)組の乱数を発生させることになります。
MT.hの中身を見ていないのですが、けっこう面倒なことをしているようで、rand()が360分かかったのに対して、genrand()の方は415分が所要時間。
で、結果はどうなのかというと、
と大差無しの結果が得られました。なんか肩透かしだな。というよりrand()もなかなかやるじゃないかという訳で安心して使用できそうだという結論。それともあと4桁くらい余計に生成させると差が出るんだろうか? ただ4桁増やすと、結果出るのが4150000分後って288日もかかるんでやる気は無いけど。
追記:
もしかして、109個ってのが多すぎだったかも。3桁くらい減らしてみたら、違いが出るか?
こんにちは
乱数での円周率の精度 いいですね。
わたしがHP電卓で頑張っても4桁しか行きませんでしたから。
ところで教えてもらったアイデアで10桁表示がうまく出来たので円周率970桁まで計算できました。
970桁! そろそろ検証が大変になって来そうな感じ。レジスタの中身を外部に出力することはできるのでしょうか。