此问题已在此处有答案:
srand() — why call it only once?(7个回答)
上个月关门了。
output
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int randint(void);
int main(void) {
for (int i = 0; i < 10; i++) {
printf("%d ", randint());
}
return 0;
}
int randint(void) {
srand((unsigned)time(NULL));
return rand() % 81 + 10;
}
我的目的是打印10个不同的数字。但每次连续打印10个重复号码。如何解决此问题?
我使用了像srand()
函数这样的库函数。我一点一点地改变了函数的位置,但结果是一样的。
预期值84 40 35 60 45 84 40 77 37 11
产量11 11 11 11 11 11 11 11 11 11 11 11
2条答案
按热度按时间enxuqcxy1#
你必须初始化你的种子只有一次,而不是每次你需要一个随机数,否则,相同的序列的数字产生,你总是选择第一个。
我认为你的代码应该是:
3htmauhk2#
对
srand()
例程的调用应该只发生一次,至少在像您这样的用例中,尽管在许多情况下这是正常的。为了进一步的阅读,你可以参考这个问题:How does calling srand more than once affect the quality of randomness?通过将它放置在例程中,您每次都要调用它,因此不断地更改您的种子,在这种情况下,它只是重置它,因此为每次调用生成相同的值。
为了摆脱这种不必要的行为,你应该把
srand()
放在main函数中,或者至少放在rand()
调用之前的位置,并在循环或其他会被重复调用的结构(如你的函数)之外。下面是代码的修改版本: