使用srand(time(NULL))
似乎过于确定。例如,当我运行std::cout << rand() % 9000
时,我得到4275.当我再次运行它时,我得到4311.它也是基于时间的。
答案 0 :(得分:1)
如果您使用C ++,我建议您使用标准库中的<random>
。它比rand()
答案 1 :(得分:1)
您的方法存在的问题是您只是采取两个样本,并假设它代表总体人口(即:基于无意义的样本量的统计谬误)。 rand()
函数返回有效形成[0, RAND_MAX]
上的统一分布的值。你提供的例子并不是一个很好的例子。
其次,在大多数现代机器上调用srand(time(NULL))
是一种不错的方法。唯一一个存在严重安全风险的时刻是在单核嵌入式芯片上运行时,该芯片没有系统时钟的备用电池。我和一些执行此操作的摩托罗拉电路板合作,大约90%的时间,当我们的程序加载时,我们最终得到相同的随机种子值。我相信80年代的一些宾果游戏机很容易受到影响,因为它们被设计为全天候运行,但是操作员每晚都把它们关闭。
最后,rand()
充其量只有一半。如果您想要一个具有更好属性的随机数生成器(即:&#34;关闭&#34;种子值不提供类似模式,更宽范围的输出值,最小偏差),请考虑使用外部RNG算法。 / p>
<强>参考强>
<https://stackoverflow.com/questions/322938/recommended-way-to-initialize-srand>
<https://stackoverflow.com/questions/18726102/what-difference-between-rand-and-random-functions>
<http://benpfaff.org/writings/clc/random.html>
答案 2 :(得分:0)
如果由于某种原因您使用rand()
时遇到问题,请在致电srand
后尝试从中排出几个值。第一次调用rand
时的相关性最大,从那时开始减少。
srand(time(NULL));
rand();
rand();
您也可以使用/dev/random
或/dev/urandom
(或Windows equivalent中的值对其进行播种。