rand()はいけてない!?
C言語の標準rand()(rand()はその名前が表すとおり乱数を生成する関数です)はいけていないらしいです。課題で正規分布の乱数を発生させる方法を調べていたところ、そのような話に出会いました。くわしくはここのページをどうぞ。
要約すると、まずC言語の標準rand()は線形合同法(つまり足し算)を使用して乱数を周期的に生成しているため、乱数の順番が決定しています。そのため、例えばn次元のベクトルを標準のrand()を用いて生成した場合、出現するベクトルが一定の順になることがあり、乱数としての役割を果たさなくなってしまうことがあるそうです。また、標準rand()は周期が短いので、数百万回規模の繰り返しには適さないようです。
そこで、かわりに使用するのがいいと推奨されていたのがメルセンヌ・ツイスターと呼ばれるものでした。この生成方法を使用すれば、比較的高速に良質な乱数が得られるようです。せっかく調べたので、今後は乱数を発生させるときにこの方法を使用してみたいと思います。
おまけの話ですが、正規乱数(正規分布に従った乱数)をえるには曲座標法という方法があるようです。ここやここを参考にしました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。