为什么我的srand(time(NULL))函数每次在c中都会生成相同的数字?

时间:2018-10-18 07:45:33

标签: 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 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())函数为何起作用,如果有人可以解释,我将非常喜欢!

1 个答案:

答案 0 :(得分:2)

原因是time(NULL)每秒仅更改一次! 这就是说,您用 same 种子为随机数生成器播种100次。 更好的方法是在过程开始时(在main()的开头仅播种一次RNG,然后应该获得不同的值。

如果您启动程序的频率超过每秒一次,则也可以使用

srand(time(NULL)+getpid());

或类似的