プロが教えるわが家の防犯対策術!

Cに標準で使える乱数の関数はそのままで使うなとよく聞きます。
自分でもこの辺とか読んでみたんですけど、
http://www001.upp.so-net.ne.jp/isaku/rand.html
gccについては何故よくないかわかりました。
下位ビットを見ると0と1が交互に出てくるんですね。

私はVC++を使っているのですがそれでも良くないんでしょうか?

具体的にどのようにVC++のrandは良くないんでしょうか。
書き足らない部分があれば補足します、よろしくお願いします。

A 回答 (3件)

関数のアルゴリズムによっては、傾向が出る為です。


その為、頻繁に(しかも少ない桁数の)乱数発生では、精度が悪いと思われるケースが出てきます。
    • good
    • 0

> 私は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++でも、メルセンヌ・ツイスタを使おうとなるわけですね。
    • good
    • 0

線形合同法の性能がそれほど高くないことは確かですが、「使うな」となるかどうかは実際の要求レベルによって異なります。


ちょっとしたランダムな処理が必要なだけであればrand関数は十分役に立ちます。逆に、高度な数値シミュレーションなどでは使い物にならないでしょう。メルセンヌ・ツイスタなどを使えば確かに疑似乱数の性能は向上しますが、パフォーマンスは低下します。
要するに、大切なのは何に使うかです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!