ここから本文です

C言語の乱数発生について質問です。

kuro_gaameさん

2011/3/3000:34:35

C言語の乱数発生について質問です。

乱数発生の際は、srand関数にtime関数を重ねることで
ランダムに数字を生成できると、参考書に書いてありました。

そこで質問なのですが、下記の例文プログラムを実行した場合、
2~10行目の数字は実行するごとにランダムで数字が表示されますが、
1行目は何回実行しても同じ数字が表示されてしまいます。
この場合は完全な乱数とはいえないのではないでしょうか。

この理由はなぜか、調べてもわかりません。
どなたかわかる方、ご指南願います。
####################################
#include<stdio.h>
#include<stdlib.h>
#include <time.h>

#define MAX 100

int main(){
int i, val;

srand(time(NULL));
for (i=0;i<10;i++){
val=((1.0/(RAND_MAX+1.0))*rand())*MAX;
printf("%d\n",val);
}
return 0;
}
####################################

閲覧数:
648
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

magurogetさん

編集あり2011/3/3015:03:55

> Mac OS X 10.6、GCC 4.2.1の環境ですと、おっしゃるようにひとつめの値が同じものが繰り返されます。

そうなんですか。そういう実装は、少しびっくりです。
もし、時間的に近接している場合だけそういう現象が出るというなら、単に、srand() に与えた time(NULL) の戻り値が直接出ているのかしら。。。

そうだとしたら、「最初に一回 rand() を呼び出してその値は捨てておけばいい」という手もありますかね。。。

===
#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int main(void){
const int max = 100;
unsigned n = 9, seed = time(NULL);
int val;

srand(seed);
val = rand();
printf("seed=%d\tfirst=%d\n", (int)seed % RAND_MAX, val);
do {
printf("%d\n", (int)(val / (1.0 + RAND_MAX) * max));
val = rand();
} while (n--);

return 0;
}
===
$ ./a.exe
seed=1301464476 first=1152797708
53
...
$ ./a.exe
seed=1301464478 first=1968845927
91
...
$ ./a.exe
seed=1301464480 first=637410497
29
...
===

わたしの環境(gcc-4.1.1; cygwin; windows XP)では、一つ目に似た値が出ることはなかったです。

なんか、わたしの gcc だけ古すぎるのはみっともないですね(笑)

質問した人からのコメント

2011/3/30 15:48:04

ご回答ありがとうございます。
お二人のご回答はどちらも素晴らしく悩んだのですが、
プログラムが記述されていたこちらをベストアンサーと致します。

実行環境に依存するんですね・・・。私の環境はWin7 VisualC++ 2010Expressです。
環境により結果が異なるというのは興味深いです。初心者ながら勉強になりました。

これから、さらなる技術向上に努めます。非常に丁寧な解説をありがとうございました。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

harawobbさん

2011/3/3013:37:06

Mac OS X 10.6、GCC 4.2.1の環境ですと、おっしゃるようにひとつめの値が同じものが繰り返されます。回答No.1の方は再現しないとおっしゃっているので、プログラムの問題ではなく、実行環境に依存する問題のようですね。
rand()を直接出力してみると、最初の数値が、同じ値ではないが近似値になることがわかります。そこで、上位ビットを切り捨てて、下位ビットだけから乱数を取り出すようにすれば、問題を回避できるでしょう。

tar0_puzzleさん

2011/3/3001:20:12

問題が再現しないので, 実行した結果の報告だけですが.
わたしが実行してみると
数が10行表示され, 実行するたびに1行目の数は変わります
[ gcc4.3.4 (WindowsVista 32bit) ]

ちなみに
rand()関数はあくまでも”擬似”乱数列を与えるものです

はじめの数をsrandで設定してあげることで
決まった規則に従って乱数っぽい数列を作り出します

ですので
srand(time(NULL)); で
起動した時間を”はじめの数”に設定することで
起動するたびに別の数からはじまった乱数っぽい数列が得られる
という仕組みです

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。