rand()はいけてない!?

C言語の標準rand()(rand()はその名前が表すとおり乱数を生成する関数です)はいけていないらしいです。課題で正規分布の乱数を発生させる方法を調べていたところ、そのような話に出会いました。くわしくはここのページをどうぞ。
要約すると、まずC言語の標準rand()は線形合同法(つまり足し算)を使用して乱数を周期的に生成しているため、乱数の順番が決定しています。そのため、例えばn次元のベクトルを標準のrand()を用いて生成した場合、出現するベクトルが一定の順になることがあり、乱数としての役割を果たさなくなってしまうことがあるそうです。また、標準rand()は周期が短いので、数百万回規模の繰り返しには適さないようです。

そこで、かわりに使用するのがいいと推奨されていたのがメルセンヌ・ツイスターと呼ばれるものでした。この生成方法を使用すれば、比較的高速に良質な乱数が得られるようです。せっかく調べたので、今後は乱数を発生させるときにこの方法を使用してみたいと思います。

おまけの話ですが、正規乱数(正規分布に従った乱数)をえるには曲座標法という方法があるようです。ここここを参考にしました。

January 11, 2004 16:49 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする