• 締切済み

rand()の乱数は何故良くないの?

Cに標準で使える乱数の関数はそのままで使うなとよく聞きます。 自分でもこの辺とか読んでみたんですけど、 http://www001.upp.so-net.ne.jp/isaku/rand.html gccについては何故よくないかわかりました。 下位ビットを見ると0と1が交互に出てくるんですね。 私はVC++を使っているのですがそれでも良くないんでしょうか? 具体的にどのようにVC++のrandは良くないんでしょうか。 書き足らない部分があれば補足します、よろしくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

線形合同法の性能がそれほど高くないことは確かですが、「使うな」となるかどうかは実際の要求レベルによって異なります。 ちょっとしたランダムな処理が必要なだけであればrand関数は十分役に立ちます。逆に、高度な数値シミュレーションなどでは使い物にならないでしょう。メルセンヌ・ツイスタなどを使えば確かに疑似乱数の性能は向上しますが、パフォーマンスは低下します。 要するに、大切なのは何に使うかです。

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

> 私はVC++を使っているのですがそれでも良くないんでしょうか? お示しになった、 http://www001.upp.so-net.ne.jp/isaku/rand.html のrand( )その2でVC++は、 static long x=S; int rand() { x=x*A+C; return(int)(x>>16)&32767; } void srand(unsigned s) { x=s; if (F) rand(); } で、A=214013, C=2531011, F=0, S=1 と解析されたとかかれていますね。 線形合同法ですので、glibcと同様の欠点を持ちます。 線形合同法の欠点を引用すれば… rand( ) その1、rand( ) その2、drand48( ) は線形合同法で乱数を発生させている。この方法に共通する欠点は、ある乱数が得られたら、次に現れる乱数が限られてしまうことだ。とくに、rand( ) その1と、 drand48( ) は、次の乱数が完全に決まってしまう。この欠点は乱数を組にして使うと問題になる。例えば2次元ベクトル(x,y)を線形合同法で発生させると、限られたベクトルしか現れない。 と言うわけで良質な乱数が必要ならVC++でも、メルセンヌ・ツイスタを使おうとなるわけですね。

回答No.1

関数のアルゴリズムによっては、傾向が出る為です。 その為、頻繁に(しかも少ない桁数の)乱数発生では、精度が悪いと思われるケースが出てきます。

関連するQ&A