Rand()不涉及时间的种子

rand() seed that does not involve time?

本文关键字:时间 种子 Rand      更新时间:2023-10-16

使用srand(time(NULL))似乎过于确定。例如,当我运行std::cout << rand() % 9000时,我得到4275。当我再次运行时,我得到4311。这太依赖于时间了。

如果您使用c++,我建议您使用标准库中的<random>。比rand()可靠得多

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

其次,在大多数现代机器上,调用srand(time(NULL))通常是一种不错的方法。唯一存在重大安全风险的时候是在单核嵌入式芯片上运行,而该芯片没有备用电池用于系统时钟。我曾经用摩托罗拉的一些董事会做过这样的工作,大约90%的情况下,当我们的程序加载时,我们最终得到的是相同的随机种子值。我相信80年代的一些宾果机很容易受到这种影响,因为它们被设计成全天候运行,但操作员每天晚上都把它们关掉。

最后,rand()最多是半体面的。如果你想要一个具有更好属性的随机数生成器(即:"接近"种子值不提供类似的模式,输出值范围更广,偏差最小),请考虑使用外部RNG算法。

引用


  1. 初始化土地的推荐方法?, 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()和rand()有哪些替代方案?, 2014-06-02, <http://benpfaff.org/writings/clc/random.html>

如果出于某种原因,您卡住了使用rand(),请尝试在调用srand后从中抽出几个值。在第一次调用rand时,相关性最大,此后逐渐降低。

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

您也可以使用/dev/random/dev/urandom中的值(或Windows中的等效值)作为种子