0から99999 の乱数を発生するには、どうしたらよろしいでしょうか?
あるサイト( http://homepage3.nifty.com/mmgames/c_guide/21-02.html )では
最小値 + (int)( rand() * (最大値 - 最小値 + 1.0) / (1.0 + RAND_MAX) )
で、必要な乱数を発生できるとあるのですが、
これを用いて、0から99999の範囲で乱数を発生させたところ、
数字が飛び飛びで発生してました。つまり、発生した数の回数を数えると、
0 => 8回
1 => 0回
2 => 0回
3 => 4回
4 => 0回
5 => 0回
6 => 9回
....(以後、99999まで同様に二つ飛び)
となっていました。
なぜこのような現象がおきて、どうやったら解決できるでしょうか?
よろしくお願いします。
すいません、補足です。
上のアルゴリズムで、小さい範囲(0〜999)でしたら、
思った通りの乱数が発生されているのを確認しています。
環境は、
WindowsXP Visual Studio .net
です。
そもそも,VC++のrand関数は15bit分の精度しか持ちません。
メルセンヌ・ツイスター乱数のような,精度の高いものを使えばよいです。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
>YuOさん
メルセンヌ・ツイスターを使ってみた所、あっさり解決しました。
15bitでは、2^15 = 32768 通りしか発生できないので、
上記のような現象が起きてたのですね。
ありがとうございました。
ツイート | ![]() |