如何使while循环中的随机数相互独立?

时间:2018-01-18 14:27:21

标签: c loops random time

我在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.
...

如何让结果更加彼此独立?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

  

e.g。

     

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将一次又一次地生成确切的随机数序列,这对测试很有用。为了做更多的事情&#34;随机&#34;种子通常设置为当前时间,预计随时间变化。

你的代码中的问题是:你的循环太快以至于每个循环得到不同的时间值,这意味着你将种子的似乎值设置了几倍,产生相同的随机结果。

如建议的那样,你需要在循环外设置种子,所以每个随机都将之前的随机结果作为种子并生成一个看似新的随机数。

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");
}