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

Why does my srand(time(NULL)) function generate the same number every time in c?

本问题已经有最佳答案,请猛点这里访问。

所以我创建了一个程序,调用一个函数并返回0或1(0表示尾部,1表示头部),然后用它来打印100次翻转的结果。

想到我可以使用srand(time(null))来为rand()添加不断变化的种子,这似乎已经足够简单了。这是我的第一个裂缝。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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("
%d Tails
"
, 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(空))改成srand(time(空)*time(空)/rand()才成功。

我唯一的想法是,每次迭代之间的时间很短,srand()函数的时间(空)部分的变化不足以提供不同的种子值。

我还尝试了srand(time(null)/rand(),但是,每次运行程序(20次以上)时都会产生相同的结果(52个heads 48个tails);但是rand()的值都是不同的。

我不知道为什么会发生这些事情,也不知道为什么最终的srand(time(空)*time(空)/rand()函数会起作用,如果有人能解释的话,我会很高兴的!


原因是,time(NULL)每秒只改变一次!这意味着,使用相同的种子对随机数生成器进行100次种子设定。一个更好的方法是在进程开始时(在main()的头部)只输入一次rng,然后您应该得到不同的值。

如果你一秒钟启动程序的次数超过一次,你也可以用

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

或者类似的。