【问题标题】:C++: Can I save a rand() generator to an object for asynchronous determinism?C++:我可以将 rand() 生成器保存到对象中以实现异步确定性吗?
【发布时间】:2017-11-24 19:01:23
【问题描述】:

我四处寻找,但很难找到完全符合我需求的东西。在用 srand() 设置种子后,我想用 rand() 生成一系列随机数。

关键是我需要异步执行此操作,并且可能会同时生成其他随机序列。我需要保持一次生成的相同确定性序列。因为 rand() 是全局的,所以我认为 rand() 没有办法做到这一点。

我认为的解决方案类似于 srand/rand 但可以保存并作为对象传递。例如

RandGenerator random(srand_seed) int r = random.get_random();

我不需要 C++11 中的任何“额外随机”实用程序,但如果它们在这里以某种方式帮助我,我会使用它们。我只是不知道在哪里看。

【问题讨论】:

  • I don't need any of the "extra random" utils from C++11 你心目中的解决方案的例子正是 C++11 random 所做的。

标签: c++ c++11 asynchronous random


【解决方案1】:

我不需要 C++11 中的任何“额外随机”实用程序

好吧,根据您的问题,C++11 random 正是您所需要的。它甚至看起来像是您脑海中的小解决方案。

这是一个受cppreference启发的示例:

#include <random>

int main()
{
    // Use the default random engine.
    // Thread local for thread safety, and to not recreate that large object.
    thread_local std::default_random_engine rnd(std::random_device{}());

    // A a uniform distribution of 1 to 6, like a dice
    // It does not have the random state, but only the distribution the numbers should have.
    std::uniform_int_distribution<int> uniform_dist(1, 6);

    // Generate a random number using a distribution and the random engine.
    int randomNumber = uniform_dist(rnd); // from 1 to 6
}

【讨论】:

  • 谢谢!!还有一个问题抱歉 - 我怎样才能播种这样的随机引擎?我查看了文档,但没有看到与 srand 等效的输入(可能遗漏了一些内容)。
  • @BenWiley 查看链接的 cppreference 链接。它解释了一切。我在那里写的例子实际上是从 cppreference 中偷来的。在我向您展示的代码中,随机引擎是使用随机物理设备播种的。
  • 谢谢@GuillaumeRacicot - 我想我明白了。抱歉,如果我的问题听起来很幼稚,我对 C++ 仍然感到很陌生。所以我猜当分发初始化时,即使我设置另一个随机引擎并在同一个线程中创建另一个新分发,它也会在初始化时保留正在使用的随机引擎?
  • 很抱歉,这是一个愚蠢的问题。我刚刚意识到我们正在将随机引擎传递给发行版。我太习惯于 C 中的魔法全局变量了……谢谢!
  • @BenWiley 不完全是。随机引擎具有生成随机数所需的所有状态。随机引擎是您希望以线程安全的方式使用的东西。然而,分布没有任何与随机数相关的状态。分发确实是轻量级的,将分发作为本地对象并没有错。该分布将简单地使用花哨的数学将生成的随机数应用于所需的分布。在特定情况下,uniform_dist(rnd) 操作(非常)大致等同于 1+ (rand() % 6)
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 2020-08-07
  • 2011-05-21
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多