乱数関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 乱数関数について

Re: 乱数関数について

#6

by 絵にかいた餅 » 2年前

ご丁寧にありがとうございます。理解できました。

Re: 乱数関数について

#5

by みけCAT » 2年前

srand関数 は、引数の値に基づいてこの後出す乱数の系列を決定します。
この値として秒単位の時刻を与えると、処理は通常1秒に100万回以上実行されるため、
高い確率で毎回同じ値が引数となり、その結果毎回同じ乱数の系列が用いられます。
よって、同じ系列なので、その最初の値も同じとなります。

なお、「サブルーチン内にいれてはいけない」というのは不正確です。
1度だけ実行されるようにする仕組みを入れることで、srandをサブルーチン内に入れても毎回初期化せずに乱数を利用することができます。

コード:

int nrand(int x) {
	static int initialized = 0;
	int y;
	if (!initialized) {
		srand((unsigned int)time(NULL));
		initialized = 1;
	}
	y = rand() % x + 1;
	return y;
}

int main() {
	int x;
	int i;
	for (i = 0; i < 100; i++) {
		x = nrand(6);
		printf("%d\n", x);
	}

	return 0;
}

Re: 乱数関数について

#4

by 絵にかいた餅 » 2年前

お手数ですがなぜsrandをサブルーチン内にいれてはいけないのか教えていただけると幸いです。

Re: 乱数関数について

#3

by 絵にかいた餅 » 2年前

ご回答ありがとうございました。解決しました。

Re: 乱数関数について

#2

by usao » 2年前

> srand((unsigned int)time(NULL));

原因はこれ.
これの場所を main の先頭にでも移して,一度だけやるようにする.

乱数関数について

#1

by 絵にかいた餅 » 2年前

乱数関数で同じ値が出てしまいます。デバックをすると値がしっかり変わっているのですが出力すると同じ数字が出てしまいます。わかるかたいたら教えてください。

コード:

int nrand(int x) {
	int y;
	srand((unsigned int)time(NULL));
	y = rand() % x + 1;
	return y;
}

int main() {
	int x;
	int i;
	for (i = 0; i < 100; i++) {
		x = nrand(6);
		printf("%d\n", x);
	}

	return 0;
}

ページトップ