【问题标题】:C++ RNG: how to get different rand generators on different processors?C ++ RNG:如何在不同的处理器上获得不同的rand生成器?
【发布时间】:2016-10-05 12:18:41
【问题描述】:

如何为随机生成器播种,以便在不同的处理器上拥有不同的数字序列?

我的第一次尝试是使用处理器的排名作为种子。 然后我发现srand(0)给出与srand(1)相同的序列。

目前,我正在这样做:

srand(time(NULL) + rank)

这是一个好的方法吗?或者,还有更好的方法? 谢谢

【问题讨论】:

  • 把时间当作种子是很常见的,你有什么理由不能这样做?
  • 如果你有 C++11 或更高版本,你应该考虑使用<random>中的生成器
  • 嘿@UKMonkey 我尝试只使用time(NULL),但有时所有触发都得到相同的种子,这是我不想要的。我希望每个处理器每次都有自己的种子。
  • std::random_device 旨在使用硬件支持的非确定性随机性(如果可用作种子)(例如,在较新的 Intel 处理器上可用)。可以使用std::random_device::entropy 检查可用性
  • 处理器等级是多少?为什么不使用 CPU ID?无论如何,如果您使用 C++,那么 <random> 会更好

标签: c++ algorithm random


【解决方案1】:

使用rand() 初始化time(NULL) 生成不同的种子,并将这些种子传递给您的进程/线程。是的,使用不同于rand() 的东西。

【讨论】:

  • 我只用过一次。
【解决方案2】:

在多线程环境中调用 time() 来播种 RNG 是自找麻烦。线程都可以得到相同的时间,它们可以得到不同的时间,而且很难控制。像您最初所做的那样,使用处理器等级为 RNG 播种,但要么使用对任何种子都表现良好的体面 RNG,或者如果您必须使用 rand(),只需调整等级以获得稍微更好的种子,例如排名 * 5 + 123;

【讨论】:

    【解决方案3】:

    如果您在 *nix 环境中,请使用 /dev/random/dev/urandom 作为熵的来源。在 Windows 上,请致电 CryptGenRandom()

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2020-02-12
      • 2022-01-11
      相关资源
      最近更新 更多