C中的重复和可预测的RNG值

时间:2018-06-10 23:39:37

标签: c

我正在尝试在C中连续生成10,000个随机数,并且无法使用伪RNG获得随机或甚至随机结果。我以一种我认为应该创造均匀性的方式使用模数,但它的结果相当于0,0,0,0,0,0,0,0,0,1,1,1,1,1 ,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3等在另一个函数中循环运行时调用RNG (4)。

<!DOCTYPE html>
<html>
  <head>
    <title>405 Not allowed.</title>
  </head>
  <body>
    <h1>Error 405 Not allowed.</h1>
    <p>Not allowed.</p>
    <h3>Guru Meditation:</h3>
    <p>XID: #some number </p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

任何使它更接近1,3,2,0,2,3,1,0,0,3,2,0,1等的方法将不胜感激!

谢谢!

编辑:感谢大家的回复!将种子移动到调用RNG的函数的开头,现在一切都很花哨!

2 个答案:

答案 0 :(得分:4)

每次要生成号码时都不要致电srandsrand初始化伪随机数生成器,并且只在程序开始时调用一次,或者当您想重置生成器时。每次重置时,每次在时钟的每秒钟内调用它时,都会强制rand生成相同的数字。

请勿使用x % n将数字减少到所需范围。 rand的旧实现非常糟糕,并且在低位中具有模式。相反,请使用x / ((RAND_MAX+1u) / n)

代码int range = RAND_MAX - (RAND_MAX % n);存在缺陷。假设n为4且RAND_MAX为7,表示rand返回0到7.此代码将range设置为4,然后while (x > range) x = rand();丢弃5,6虽然它保留了4,但这里有两个错误:代码保留了5个值0,1,2,3和4,这与所需的4的范围(不是其倍数)不匹配,并且它不必要地丢弃了价值观。如果我们保留4,5,6和7,我们就会匹配。你可以使用:

unsigned range = (RAND_MAX + 1u) - ((RAND_MAX + 1u) % n);

while (x >= range) x = rand();

如果您使用的是C ++,请切换到使用std::uniform_int_distribution。如果您使用的是C,请检查您的实施中rand的质量,或者切换到其他生成器,例如POSIX srandomrandom

答案 1 :(得分:0)

正如其他地方所述,对重复数字的修正是将调用移到此函数之外的srand(time(NULL)),并在开始时每个程序只调用一次。

至于你为什么要重复数字:这个函数每秒被调用几次。每次函数在给定的秒内执行时,time(NULL)返回相同的数字,此代码用于为随机数生成器播种。

从特定种子生成的随机数序列将始终相同。此代码获取该序列中的第一个数字,该值在一秒内始终相同,直到time(NULL)返回新值。