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

2023-11-30

所以我正在创建一个程序,它会调用一个函数并返回 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()) 函数起作用,如果有人可以解释,我会很高兴!


原因是,time(NULL)每秒只改变一次! 这意味着,您可以使用以下命令为随机数生成器播种 100 次same种子。 更好的方法是在流程开始时(在比赛开始时)只为 RNG 播种一次main(),那么你应该得到不同的值。

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

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

或类似的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 srand(time(NULL)) 函数在 c 中每次都会生成相同的数字? [复制] 的相关文章

随机推荐