我正在尝试在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的函数的开头,现在一切都很花哨!答案 0 :(得分:4)
每次要生成号码时都不要致电srand
。 srand
初始化伪随机数生成器,并且只在程序开始时调用一次,或者当您想重置生成器时。每次重置时,每次在时钟的每秒钟内调用它时,都会强制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 srandom
和random
。
答案 1 :(得分:0)
正如其他地方所述,对重复数字的修正是将调用移到此函数之外的srand(time(NULL))
,并在开始时每个程序只调用一次。
至于你为什么要重复数字:这个函数每秒被调用几次。每次函数在给定的秒内执行时,time(NULL)
返回相同的数字,此代码用于为随机数生成器播种。
从特定种子生成的随机数序列将始终相同。此代码获取该序列中的第一个数字,该值在一秒内始终相同,直到time(NULL)
返回新值。