
Cに標準で使える乱数の関数はそのままで使うなとよく聞きます。
自分でもこの辺とか読んでみたんですけど、
http://www001.upp.so-net.ne.jp/isaku/rand.html
gccについては何故よくないかわかりました。
下位ビットを見ると0と1が交互に出てくるんですね。
私はVC++を使っているのですがそれでも良くないんでしょうか?
具体的にどのようにVC++のrandは良くないんでしょうか。
書き足らない部分があれば補足します、よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
線形合同法の性能がそれほど高くないことは確かですが、「使うな」となるかどうかは実際の要求レベルによって異なります。
ちょっとしたランダムな処理が必要なだけであればrand関数は十分役に立ちます。逆に、高度な数値シミュレーションなどでは使い物にならないでしょう。メルセンヌ・ツイスタなどを使えば確かに疑似乱数の性能は向上しますが、パフォーマンスは低下します。
要するに、大切なのは何に使うかです。
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++でも、メルセンヌ・ツイスタを使おうとなるわけですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2の補数を計算するプログラム
-
16bitで乱数を生成する方法
-
階乗のプログラム
-
放射状ブラー C言語で書いたの...
-
OpenCVによる4値化について
-
C#で疑似カラー
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
配列をnビットシフトする
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
-
sscanfとscanfの違いがよくわか...
-
main.c:7:43: warning: implici...
-
#define _CRT_SECURE_NO_WARNIN...
-
InvokeMemberメソッドとは何を...
-
【#define】 defineで定義した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報