rand()种子不涉及时间?

时间:2014-06-02 17:19:22

标签: c++ random time srand

使用srand(time(NULL))似乎过于确定。例如,当我运行std::cout << rand() % 9000时,我得到4275.当我再次运行它时,我得到4311.它也是基于时间的。

3 个答案:

答案 0 :(得分:1)

如果您使用C ++,我建议您使用标准库中的<random>。它比rand()

更可靠

答案 1 :(得分:1)

您的方法存在的问题是您只是采取两个样本,并假设它代表总体人口(即:基于无意义的样本量的统计谬误)。 rand()函数返回有效形成[0, RAND_MAX]上的统一分布的值。你提供的例子并不是一个很好的例子。

其次,在大多数现代机器上调用srand(time(NULL))是一种不错的方法。唯一一个存在严重安全风险的时刻是在单核嵌入式芯片上运行时,该芯片没有系统时钟的备用电池。我和一些执行此操作的摩托罗拉电路板合作,大约90%的时间,当我们的程序加载时,我们最终得到相同的随机种子值。我相信80年代的一些宾果游戏机很容易受到影响,因为它们被设计为全天候运行,但是操作员每晚都把它们关闭。

最后,rand()充其量只有一半。如果您想要一个具有更好属性的随机数生成器(即:&#34;关闭&#34;种子值不提供类似模式,更宽范围的输出值,最小偏差),请考虑使用外部RNG算法。 / p>

<强>参考


  1. 推荐的方法来初始化srand?,已访问2014-06-02,<https://stackoverflow.com/questions/322938/recommended-way-to-initialize-srand>
  2. rand()和random()函数有什么区别?,已访问2014-06-02,<https://stackoverflow.com/questions/18726102/what-difference-between-rand-and-random-functions>
  3. C库的rand()和srand()有哪些替代方案?,访问2014-06-02,<http://benpfaff.org/writings/clc/random.html>

答案 2 :(得分:0)

如果由于某种原因您使用rand()时遇到问题,请在致电srand后尝试从中排出几个值。第一次调用rand时的相关性最大,从那时开始减少。

  srand(time(NULL));
  rand();
  rand();

您也可以使用/dev/random/dev/urandom(或Windows equivalent中的值对其进行播种。