因此,我正在创建一个程序,该程序将调用一个函数并返回0或1(0表示尾巴,1表示头部),然后使用它来打印100次翻转的结果。
这似乎很简单,以为我可以使用srand(time(NULL))用不断变化的种子来播种rand()。这是我的第一个裂缝。
#include <stdio.h>
#include <stdlib.h>
int flip();
int main(void) {
int heads = 0;
int tails = 0;
for (short int count = 1; count <= 100; ++count) {
int number = flip();
if (number == 0) {
printf("%s", "Tails");
++tails;
}
else if (number == 1) {
printf_s("%s", "Heads");
++heads;
}
}//end for
printf_s("\n%d Tails\n", tails);
printf_s("%d Heads", heads);
}//end main
int flip(void) {
srand(time(NULL));
int number = (int)rand();
printf("%d", number%2);
return number%2;
}//end flip
我将运行该程序,并且我的rand()值将始终是for语句的每次迭代(即15367、15745或15943)中重复的五位数整数。
直到我发现将srand(time(NULL)*更改为srand(time(NULL)* time(NULL)/ rand())达到目的为止,我一直在搞乱。
我唯一的想法是,每次迭代之间的时间是如此之短,以至于srand()函数的time(NULL)部分的变化不足以提供不同的种子值。
我也尝试了srand(time(NULL)/ rand()),但是,每次我运行该程序(20次以上)时,都会产生相同的结果(52头48尾)。但是,rand()值互不相同。
我不知道为什么会发生这些事情,或者最终的srand(time(NULL)* time(NULL)/ rand())函数为何起作用,如果有人可以解释,我将非常喜欢!
答案 0 :(得分:2)
原因是time(NULL)
每秒仅更改一次!
这就是说,您用 same 种子为随机数生成器播种100次。
更好的方法是在过程开始时(在main()
的开头仅播种一次RNG,然后应该获得不同的值。
如果您启动程序的频率超过每秒一次,则也可以使用
srand(time(NULL)+getpid());
或类似的