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;
}
[url=https://nxmnpg.lemoda.net/ja/3/srand]srand関数[/url] は、引数の値に基づいてこの後出す乱数の系列を決定します。
この値として秒単位の時刻を与えると、処理は通常1秒に100万回以上実行されるため、
高い確率で毎回同じ値が引数となり、その結果毎回同じ乱数の系列が用いられます。
よって、同じ系列なので、その最初の値も同じとなります。
なお、「サブルーチン内にいれてはいけない」というのは不正確です。
1度だけ実行されるようにする仕組みを入れることで、srandをサブルーチン内に入れても毎回初期化せずに乱数を利用することができます。
[code]
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;
}
[/code]