• ベストアンサー

乱数について

こんばんは。 何度も申し訳ありませんが、今回は乱数について教えてください。 LinuxでCを勉強しているんですが、 randで乱数を発生させることはできたんですが、 そのプログラムを何度実行させても 出てきた乱数は同じ値なんです。 プログラム内で例えば10こ乱数を発生させたとすると 違うものが出ます。 しかし、もう一度そのプログラムをはしらせると 前回と全く同じ並びで同じ数が出るのはどうしてでしょうか? 言ってる意味わかっていただけましたでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • KOH_da
  • ベストアンサー率31% (161/506)
回答No.3

乱数は計算によって、擬似的に求めています。 そのため同じ乱数が順番に出てきます。 乱数を初期化することで、順番の途中から使うことができます。 srand()がその関数です。 一般的にはプログラムが起動された時間を利用し、 乱数を初期化することが行なわれます。 コンパイラによって違うかもしれませんが、 たいてい、こんな感じで初期化します。 srand(time()); 他にも方法はあります。 たとえば、人が入力するまでの時間は規則性がないので、 このとき、乱数の空回しをしてやることで、 乱数の周期性をなくすことができます。 while(1) {  rand(); ←乱数の空回し  入力待ち;  if(入力あり) break; }

その他の回答 (2)

  • tokkyz
  • ベストアンサー率55% (31/56)
回答No.2

乱数はでたらめに見えますが、実は複雑な計算によって作られています。そのため初期値が同じだと同じ数字が並ぶんです。 乱数にも種類があるのでどの乱数もそうだとはいえませんが、Cではそうなってます。 Cでの使い方 http://naruzo.cside1.com/html/online/ckouza/ckouzab2.htm M系列乱数の数学的解説 http://www.ysr.net.it-chiba.ac.jp/data/rand/node6.html

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

rand()を行う前にsrand()は行ったでしょうか? 参考URLはVisualC++のものですが、互換性欄に「ANSI」と書いてあるので、Linux上のCでも同様だと思います。

参考URL:
http://www.microsoft.com/japan/developer/library/vccore/_crt_srand.htm

関連するQ&A

  • 乱数の最大値

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

  • 乱数を発生させるプログラムを教えてください。

    タイトルのままなのですが、1から100までの乱数を発生させるプログラムを知りたいです。 乱数をxとおくと、xの値は、0<x<1の範囲内でお願いします。 C言語で、rand関数を用いて、どうかお願いします。

  • 乱数をC言語で

    乱数をC言語でプログラムしたいのですが、 rand関数を使わずに作らなきゃいけないという事なんですが 一度作ってはみたもののうまく乱数にできずに困っています できれば教えていただきたいです

  • 乱数について・・・

    (1)1,2,3,4の整数のどれかを乱数で発生させる方法 (2)0~1までの実数を発生させる方法 を教えていただけないでしょうか?(a.outするたびに値が変わってほしいです。) ※一応、下のプログラムにあるように実行するたびに違う乱数がanswerに入るようにはできたのですが、いまいち理解できていません。軽い説明や参考URLなども教えてもらえたら助かります。 よろしくお願いします。 #include<time.h> int main() { unsigned short time_a,time_b; unsigned long answer; time_a = time(NULL); time_b = time_a; srand(time_b); answer = rand(); printf("答えは = %d\n",answer); }

  • 標準正規分布の乱数

    RAND()関数は ((double)rand() / (1.0 + RAND_MAX))と定義します。 中心極限定理により、一様乱数を足し合わせると正規分布に近づくことから、 x = 分散 * (Σ[1~12]RAND() - 6) + 平均 で正規乱数が作れる。標準正規分布は分散1、平均0なのでその乱数は x = Σ[1~12]RAND() - 6 ですよね。この乱数を例えば100個羅列するにはどうしたらいいのでしょうか? もし間違ってたら指摘してください。 参考文献「Cによるシミュレーションプログラム 石川宏」 #include <stdio.h> #include <stdlib.h> #define RAND() ((double)rand() / (1.0 + RAND_MAX)) #define NUMBER 10000 /* 発生させる乱数の数 */ main(void) { int j; double u, x; srand(5); for (j = 0; j <= 11; j++) { u = u + RAND(); } x = u - 6.0; }

  • 発生乱数の偏りを無くしたい

    エクセルで=RAND()を用いてA1~A100のセルに100個乱数を発生させたときに(乱数は0~1の幅)、0~1の値を偏り無く発生させることは可能でしょうか?? 発生した100個の乱数をコピーして形式を“値”にして貼り付けてその100個の乱数の平均や中央値をみてみると0.5にはならないことから疑問に思いました・・・。 ご存知の方アドバイスよろしくお願いします。

  • Perlの乱数について

    RedHat Linux ES2.1のperl v5.6.1にて初めてのプログラムを書いているものです。 Oracle9iに格納するDATE型のデータを大量に乱数にて作成しようとしているのですが、うまくいきません。 作成しようとしているのは2004年度か2005年度のある日付です(30日まで)。 例) 04-01-30 05-07-12 04-09-28 04-12-11 質問1.下のプログラムだと、年度が00,01,02,03,04,05の値をとり得てしまう。これを04か05に限定するにはどうすればよいか。 質問2.月・日が1桁の場合は0を頭につけたい。下のプログラムでは05-12-1となったり04-5-30となったりしてしまう。 #!/usr/bin/perl $a = 1; while($a < 100000){ $year_rand = int(rand(5)); $month_rand = int(rand(12))+1; $day_rand = int(rand(30))+1; print "0$year_rand-"; print "$month_rand-"; print "$day_rand,"; print "\n"; $a = $a+1; } 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • プログラミングの乱数

    c言語、c++の乱数rand()の使い方がよくわかりません。わかりやすい説明をお願いします。 あと、プログラミングが得意な方にお願いです。 [0,1]乱数で平均と分散を求めるプログラムを配列なしで作ってください。

  • 乱数について

    C の入門書を1冊読み終え、簡単なプログラムを作成しようとしているのですが、 早速分からないことが出たので教えて頂ければと思います。 --------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num; int i = 0; while( i < 4 ){ srand(time(NULL)); num = rand()%100; printf("%d\n", num); i++; } return 0; } --------------------------------------------- 上記を実行したのですが、秒数を乱数の種としているため4回とも同じ値を取得してしまいます。 より高精度に秒数を取得することは可能でしょうか? もしくはこのようなかたちで4回ともに異なる数を得ることが出来る方法がありましたら教えて頂きたいと思います。

  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。