大きい範囲で乱数を発生するには?

解決


へびお  2006-01-17 07:20:34  No: 60311

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まで同様に二つ飛び)

となっていました。

なぜこのような現象がおきて、どうやったら解決できるでしょうか?
よろしくお願いします。


へびお  2006-01-17 07:28:12  No: 60312

すいません、補足です。

上のアルゴリズムで、小さい範囲(0〜999)でしたら、
思った通りの乱数が発生されているのを確認しています。

環境は、
WindowsXP Visual Studio .net 
です。


YuO  2006-01-17 07:37:33  No: 60313

そもそも,VC++のrand関数は15bit分の精度しか持ちません。
メルセンヌ・ツイスター乱数のような,精度の高いものを使えばよいです。
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html


へびお  2006-01-17 20:35:27  No: 60314

>YuOさん
メルセンヌ・ツイスターを使ってみた所、あっさり解決しました。

15bitでは、2^15 = 32768 通りしか発生できないので、
上記のような現象が起きてたのですね。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加