【问题标题】:Duplicate output when using srand for random seed [closed]将 srand 用于随机种子时重复输出 [关闭]
【发布时间】:2014-10-04 22:31:18
【问题描述】:

我正在使用 srand (time(NULL));生成随机种子。

问题是,我正在向一个 LINUX 集群提交 30 多个相同的作业。如果我一次提交一个,一切都很好,但我当然更喜欢使用批处理作业一次提交所有 30 个。更容易和更快。问题是,然后几批作业似乎都在同一时间访问,我得到重复的结果!任何人都可以提出一个简单的解决方案吗?

【问题讨论】:

标签: c++ random srand


【解决方案1】:

考虑从/dev/random/dev/urandom 读取。它们比rand()(通常只是一个简单的线性同余生成器)具有更高质量的随机性,并且/dev/random 会阻塞直到建立足够的熵。

【讨论】:

  • 或者使用它们为生成器播种...
  • 用任意一个随机设备播种rand() 没有任何意义。 rand() 旨在快速生成出现随机的数字。用随机设备播种只会限制熵。
  • 这将避免他在批处理作业中重复生成器状态的问题。我不确定用/dev/{u}/random 播种rand() 会如何限制熵。你能解释一下吗?
  • 当然,但这只是增加了另一层复杂性。当您已经有一个很好的随机数来源时,为什么还要打电话给rand()?用任何一种设备播种rand() 都会限制熵,因为rand() 的输出很容易预测,即使输入很好。这只是其实施的本质。
  • 更正:我可能错了。我不知道rand() 在Linux 上的实现细节。在其他 Unix(y) 系统上,rand() 通常只是一个简单的 LCG 或 Twister,其输出在一定次数的迭代后变得可预测。如果在 Linux 上不是这种情况,使用随机设备的输出播种 rand()可能不会显着损害熵。
【解决方案2】:

查看 C++11 中 <random> 中的新功能。特别是 std::random_device。否则,一个俗气的解决方案是将 pid 添加到 time(NULL)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多