c++ - 我应该使用从 std::random_device 播种的随机引擎还是每次都使用 std::random_device

标签 c++ random c++11

我有一个包含两个随机源的类。

std::random_device rd;
std::mt19937 random_engine;

我通过调用 std::random_devicestd::mt19937 播种。如果我想生成一个数字并且我不关心可重复性,我应该调用 rd() 还是 random_engine()

在我的特定情况下,我确信两者都可以正常工作,因为这将在某些网络代码中调用,其中性能不是很重要,结果也不是特别敏感。但是,我对何时使用硬件熵以及何时使用伪随机数的一些“经验法则”感兴趣。

目前,我只使用 std::random_device 来播种我的 std::mt19937 引擎,以及我的程序需要的任何随机数生成,我使用std::mt19937 引擎。

编辑:以下是我使用此特定示例的确切含义的解释:

这是一个游戏程序。这个特定的游戏允许用户在与对手开始一轮之前自定义他们的“团队”。设置战斗的一部分涉及将团队发送到服务器。我的程序有几个团队,并使用随机数来确定要加载哪个团队。每场新的战斗都会调用 std::random_device 来播种伪随机数生成器。我记录了战斗的初始状态,其中包括我随机选择的这个团队和初始种子。

我在这个问题中询问的特定随机数是用于随机团队选择(不让对手提前知道我正在使用的团队是有益的,但不是关键任务),但是我真正在寻找的是经验法则。如果我不需要我的数字的可重复性,那么总是使用 std::random_device 是否可以,或者真的存在熵用完的风险比收集它的速度快吗?

最佳答案

据我所知,标准做法是使用计算机未计算的数字(但来自某些外部的、不可预测的来源)为随机数生成器播种。您的 rd() 函数应该是这种情况。从那时起,您可以为所需的每个伪随机数调用伪随机数生成器 (PRNG)。

如果您担心数字不够随机,那么您应该选择不同的 PRNG。熵是一种稀缺而珍贵的资源,应该这样对待。虽然,您现在可能不需要那么多随机数,但将来可能需要;或其他应用程序可能需要它们。您希望该熵在应用程序请求时可用。

听起来,对于您的应用,mersenne twister 可以很好地满足您的需求。玩你的游戏的人不会觉得加载的团队不是随机的。

关于c++ - 我应该使用从 std::random_device 播种的随机引擎还是每次都使用 std::random_device,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11817493/

相关文章:

java - 如何显示尝试次数并仅对输入的相同数字显示 1 次计数

c++ - 模板元编程如何专注于集合

c++ - 如何推断lambda的返回值的类型。?

c++ - QLabel 在调用时没有响应 `setText()`

c++ - 对于Qt开发,C++相对于其他语言有什么优势?

c++ - boost asio 异步写入处理程序调用自身

algorithm - 如何在多个集合上创建均匀分布?

c - 只读取文件 C 中的奇数/偶数行

c++ - 使公共(public)成员只读

c++ - 子进程 C++ 的 Windows 控制台信号处理