• ベストアンサー

完全な乱数を生成する方法

C言語で乱数を生成するときに、今まで srand(time(NULL)); を使用していたのですが、それだと1秒以内に複数の処理を行った際に、 同一の乱数が生成されてしまいます。 時間にとらわれずに完全にランダムな数字を出現させるにはどのような方法を取るのが簡単なのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

乱数を生成させるたびにsrand(time(NULL));しているのなら、そうなるでしょう。 どこかで最初に一回だけ呼ぶので十分ではありませんか?

windywatery
質問者

お礼

関数の中にsrandを突っ込んでいたためでした・・・>< ありがとうございました^^

その他の回答 (3)

noname#21649
noname#21649
回答No.4

Fotran なので多少異なる場合があります。 多分 32ビットの符号付整数を16ビット符号付整数で割るという一般的ルーチンを使っていると思います。 3次元ですとたしか13面に収束するのでちょっと面倒ですが。 この擬似乱数プログラム(乱数の入門ですからどこかに有るかと思います)を探してきて.組込み関数を使わずに個別のルーチンとして使うのが簡単な方法化と思います。 なお.確実な擬似らん数は.外部配列にテーブルを作り.組込み関数でかき混ぜるのがなんと言っても楽です。周期を自分で管理できますから。 モンテカルロでちょっと遊んだときに目いっぱい苦しんだのが乱数の周期性です。少しならばなんとでもなるのですが.ある程度大きくなると周期性とかたよりが出てしまって苦しみます。通常無限大に発散させれば偏りが消えることにはなっていますが.実数で偏りを除くのに苦労しました。

  • Soli
  • ベストアンサー率11% (7/61)
回答No.3

どの環境でプログラミングしておられますか? 超高速で複数のsrandをする場合はこの方法ではダメかもしれませんが、 Win32で作っているならば GetLocalTime()等のAPIを使って ミリ秒を取得し、それを使って乱数を初期化すれば良いと思います。 もっとシビアなタイミングに対応するならば 環境は限られてくるかもしれませんが、 QueryPerformanceCounter()APIを使うと ミリ秒よりも高精度な値が取れます。

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.2

お使いの環境に乱数装置が実装されていないか調べてみるといいかもしれません。 FreeBSDにはsrandomdev() という乱数装置を利用した乱数系列初期化ルーチンとrandom()という比較的高精度な32bit乱数が実装されています。 この乱数はsrand()/rand()より3割ほど遅いが乱数の精度はずっとよいものです。 #1氏がツッこんでいる「生成されるたびに」ということですが、毎回srandするのではなく、例えばCGIで、複数のプロセスが独立に起動されることを想定しているのでしょうか。 その場合でしたら、共有メモリにカウンタを用意するとか、プロセスid(などのプロセスに固有の値)+time(NULL)をキーにするなどすれば、よいのではないでしょうか。

関連するQ&A

  • 乱数の最大値

    C言語で0~Nまでの乱数を発生させる場合、 srand((unsigned) time(NULL)); rand()%N; とやりますよね。 このやり方だと、発生する乱数はRAND_MAX以下しかできません。 RAND_MAX以上の値を発生させるにはどうすればいいのでしょうか?

  • 乱数で交互に偶数、奇数が、、、。

    C言語で、確率2分の1で0と1を 出そうとして、rand,srand,timeを使って やってみたのですが、ちょうど、0と1が 交互に出てしまいます。何度やっても 変わりません。ただ、1と0が逆になる だけ。こんな感じで0101010101か1010101010 つまり、乱数で奇数と偶数が 交互に発生しているみたいうまくいきません。 なにか、別の方法ありますか? --------------------------------------- srand((unsigned int)time(NULL)); s=rand()%2 これで、やってます。

  • 毎回違う乱数を生成するにはどうしたらいいでしょうか

    C言語の初心者です。よろしくお願いいたします! 乱数に関する質問:毎回違う乱数を生成するにはどうすればいいでしょうか。 学校の講義の中に  >>time() は1970 年1 月1 日0 時0 分(標準時)からの経過秒数を返 すため,1 秒以内に何度も実行すると,同じ数字で乱数を初期化す ることになり,結果も同じになってしまう. という記述がありますが、時間を置いてから、実行しても同じ結果となりました。 その一 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { double x,y; int i,index=0; double a,n; printf("How many trials?..."); scanf("%lf",&n); for (i=0;i<n;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1) index++;} a=4*index/n; printf("Result is %.2f(%.2f)",a,sin(-a)); return 0; } その二 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a; srand((unsigned)time(NULL)); a=(int)(rand()/(RAND_MAX+1.0)*10); printf("%d\n",a); return 0; } お忙しい中、教えていただけたらうれしいです。

  • 乱数について

    Visual Studio2008を使っています。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i; srand(time(NULL)); i=rand(); printf("%d\n",i); return 0; } 乱数を作るために上のようなプログラミングを作りました。 これを「ソリューションのビルド」すると 【warning C4244: '引数' : 'time_t' から 'unsigned int' への変換です。データが失われる可能性があります。】 と出ます。 このまま行っても乱数が出来るのですが どうしたらいいのでしょうか? 8行目を srand(time_t(NULL)); srand((unsigned)time(NULL)); と変えればいいのでしょうか? time_tでやると乱数が同じ値しか出てきません。 教えてください。

  • 乱数の取得

    キー操作をした時に複数の乱数を習得させようと思っています。 【キ─操作関数】  int num[3] = {11, 22, 33}; ←初期化のため数字は適当です。  srand((unsigned int)time(NULL))  for(int i=0; i<=3; i++)  {   num[i] = rand % 10;  } 上記のプログラムを書いています。 num[0]、num[1]、num[2]にそれぞれ0~9の乱数が入ると思うのですが、 num[0]にしか乱数が入りません。 num[1]、num[2]には同じ数字(恐らくtimeで取得した数字?)が入っています。 何かお気づきの点がありましたらアドバイスお願い致します。

  • LSI C-86を利用した時の乱数の挙動について

    C++の6.0を使っています。 srand((unsigned)time(NULL)); を使って1~9の乱数を作らせているのですが、 LSI C-86 Ver 3.30 試食版を使ってexeを作り、 作られた乱数を見ると 1の位置だけがランダムに決まり、   3 2 1 9 8 7 6 5 4 のように、他の数値は順番になってしまいます。 C++上で実行している時は、 全ての数値がランダムに配置されます。 これがどのような理由によるものなのか わかる方がいらっしゃいましたら、 その理由と解決策をお願いします。

  • 乱数の生成法

    乱数を生成するようなショートプログラムを知りたいのですが、 どんなものがありますか? C言語でお願いします。

  • c言語で乱数を扱うときの

    乱数を初期化するために srand((unsigned)time(NULL)というのを使いますが これはどういう意味を表してるんでしょうか? timeは1970年から経過した時間を表していることは分かりますし unsignedは符号ビットをなくして表せる数を倍にしてることも分かりますが、 NULLって何のために書いてあるのでしょうか?

  • 乱数

    乱数を発生させる際に Sub Sample() Debug.Print Int((10 - 1 + 1) * Rnd + 1) End Sub で、1から10までの乱数を発生できますが、 1から10と言う連続した数字ではなく、 例えば10,13,18,43・・・ という規則性のない複数の数字からランダムに数字を発生させるにはどうすればいいでしょうか? 10,13,18,43の中から10を返したり、18を返したりする方法を教えてください。

  • 乱数発生関数randomなど

    random, srandom, initstate, setstate で乱数を生成できることを知りましたが、運用方法がよくわかりません。c言語に詳しい方、for文を使って乱数を5個ほど表示させるプログラムを示してください。

専門家に質問してみよう