乱数関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
絵にかいた餅
記事: 13
登録日時: 2年前

乱数関数について

#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;
}

アバター
usao
記事: 1889
登録日時: 11年前

Re: 乱数関数について

#2

投稿記事 by usao » 2年前

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

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

絵にかいた餅
記事: 13
登録日時: 2年前

Re: 乱数関数について

#3

投稿記事 by 絵にかいた餅 » 2年前

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

絵にかいた餅
記事: 13
登録日時: 2年前

Re: 乱数関数について

#4

投稿記事 by 絵にかいた餅 » 2年前

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

絵にかいた餅
記事: 13
登録日時: 2年前

Re: 乱数関数について

#6

投稿記事 by 絵にかいた餅 » 2年前

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

返信

“C言語何でも質問掲示板” へ戻る