【发布时间】:2014-11-30 00:56:25
【问题描述】:
我试图在每次循环发生时创建 2 个随机数(介于 0-4 和 0-10 之间),但它总是给出相同的数字。 如果我多次运行该程序,它会给出不同的数字,但 while 循环总是生成相同的 2 个数字。 谢谢。
int random(int range){
int num;
srand(time(NULL));
num = rand() % range;
return num;
}
int main(){
int cnt = 0;
int i;
int j;
while (cnt <= 20) {
i = random(5);
j = random(10);
printf("%d\n",i);
printf("%d\n",j);
printf("\n");
cnt += 1;
}
return 0;
}
【问题讨论】:
-
在 main 中调用 srand 一次(并且仅一次)。搜索一下,这个问题每周都会出现。
-
如果您在同一毫秒内调用
srand(),您将获得相同的输出,它根本不会是随机的。是的,计算机将在一毫秒内处理两个srand(),因此答案将是相同的。srand()用于使随机化器在外人面前随机运行。你不必像人们说的那样只使用一次srand(),如果你想让公众更难以预测结果,你可以每分钟都使用它。 -
谁对这个问题投了赞成票,为什么?
-
请注意,在大多数实现中,rand() 是一个质量很差的伪随机数生成器。它在相当短的时间内重复。如果随机数的质量很重要,请考虑寻找更好的生成器。如果您使用的是 Linux,/dev/urandom 是一个很好的选择。
-
另一个质量点是
rand()%range表达式不能可靠地提供均匀分布,尤其是当range相对于rand()的最大值较大时。