【问题标题】:rand() seed that does not involve time? [duplicate]rand() 不涉及时间的种子? [复制]
【发布时间】:2014-07-22 21:24:40
【问题描述】:

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

【问题讨论】:

  • 那只是碰巧他们彼此如此接近。当您的号码是随机的时,就会发生这种情况。
  • 另外,既然您要求使用 C++,您可能需要考虑使用 the new random number library
  • 你认为这是确定性的吗?我挑战你猜下一个数字。
  • @MartinKonecny,这不是机会,我自己在微软实现rand 时遇到了同样的问题。使用的公式显示了种子和产生的第一个值之间的明确相关性。
  • 为了生成高熵种子值本身,使用std::random_device 类是正确的,它是新<random> 库的一部分。对于较旧的编译器(C++11 之前),您可以使用TR1 random libraryBoost.Random,它们几乎相同。否则,您也可以从 /dev/random or /dev/urandom 或非 Unix 等效项 (?) 中读取。

标签: c++ random time srand


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

最后,rand() 充其量是半体面的。如果您想要一个具有更好属性的随机数生成器(即:“关闭”种子值不提供类似模式、更广泛的输出值、最小偏差),请考虑使用外部 RNG 算法。

参考文献


  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>

【讨论】:

    【解决方案3】:

    如果由于某种原因您无法使用 rand(),请尝试在调用 srand 后从中提取几个值。相关性在第一次调用 rand 时最大,然后从那时起降低。

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

    您还可以使用来自/dev/random/dev/urandom(或Windows equivalent 的值)作为种子。

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多