为什么我的srand(time(NULL))函数每次在c中生成相同的数字?
所以我创建了一个程序,调用一个函数,返回0或1(0表示尾部,1表示头部),然后用它打印100次翻转的结果 我可以使用srand(time(NULL))为rand()添加不断变化的种子,这似乎很简单。这是我的第一次尝试为什么我的srand(time(NULL))函数每次在c中生成相同的数字?,c,random,std,srand,C,Random,Std,Srand,所以我创建了一个程序,调用一个函数,返回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
#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
#包括
#包括
int flip();
内部主(空){
int头=0;
int-tails=0;
对于(short int count=1;count原因是,time(NULL)
每秒只更改一次!
这意味着您将使用同一种子对随机数生成器进行100次种子设定。
更好的方法是在进程开始时(在main()
的开头)仅为RNG种子设定一次,然后您应该获得不同的值
如果你启动程序的频率超过每秒一次,你也可以用
srand(time(NULL)+getpid());
或类似。检查此项:通常,您只需调用srand一次,然后单独调用rand。srand为PRNG种子。它意味着在应用程序启动时调用一次。或者此项与%一起使用不会给您带来良好的分发效果。您最好使用返回号码>rand_MAX/2;
(通常,number*desiredMax/RAND_MAX是一种很好的方法-只要您正确处理可能发生的溢出)。