【问题标题】:How to make random numbers in a while loop independent from each other?如何使while循环中的随机数彼此独立?
【发布时间】:2018-06-27 15:49:09
【问题描述】:

我在while 循环中有一个随机生成的数字。因为我在运行它时使用time(NULL) 播种它,所以我得到类似结果的流,而我希望它更加“异构”

函数如下:

while(1) {
    srand((unsigned int) time(NULL));   // Seed
    double chance = random() / (double) RAND_MAX;
    if (chance <= 0.95)
        printf("All ok.\n");
    else
        printf("ERROR\n");
}

例如,结果如下:

...
All ok.
All ok.
All ok.
All ok.
All ok.
ERROR
ERROR
ERROR
ERROR
ERROR
All ok.
All ok.
All ok.
All ok.
All ok.
...

如何使结果更加彼此独立

【问题讨论】:

  • 在程序开始时只调用一次srand

标签: c loops random time


【解决方案1】:

不要在循环中随机播种。一般来说,您只想播种一次:

srand((unsigned int) time(NULL));   // Seed
while(1) {
    double chance = random() / (double) RAND_MAX;
    //...
}

计算机的速度足以在 time() 函数的分辨率内多次运行此循环,因此您最终会多次重新播种到相同的数字。

有关在 C 中生成随机数的更多信息,请参阅 https://stackoverflow.com/a/822368/2721883https://stackoverflow.com/a/39475626/2721883

【讨论】:

    【解决方案2】:

    基本问题是rand没有生成真实随机数:在计算中,生成随机数是一个非常复杂的问题,解决方法是(一般)使用伪随机数数字,看起来是随机的,但每个数字都是基于前一个数字构建的:

    例如

    n0 = 5(种子 = 5)
    n1 = ((n0*10+1) % 7) = 2
    n2 = ((n1*10+1) % 7) = 0
    n3 = ((n2*10+1) % 7) = 1
    n4 = ((n3*10+1) % 7) = 4 ...

    必须仔细选择 10、7 和 1 才能使 随机数。

    https://en.wikipedia.org/wiki/Linear_congruential_generator

    srand设置第一个种子值,每个新的随机数都使用之前生成的随机值作为种子。

    将特定值设置为srand 将一次又一次地生成精确的随机数系列,这对测试很有用。为了使某些东西更“随机”,种子通常设置为当前时间,预计会随着时间而改变。

    您的代码中的问题是:您的循环太快了,无法在每个循环中获得不同的时间值,这意味着您为种子设置了多次看起来值,生成相同的随机结果。

    按照建议,您需要将种子设置在循环之外,因此每个随机数都将先前的随机结果作为种子并生成一个看似新的随机数。

    srand((unsigned int) time(NULL));   // Seed
    while(1) {
        double chance = random() / (double) RAND_MAX;
        if (chance <= 0.95)
            printf("All ok.\n");
        else
            printf("ERROR\n");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-17
      • 2020-12-15
      • 2016-06-11
      • 2016-01-19
      • 2017-04-08
      • 2016-12-29
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多