问题 我什么时候使用std :: random_device?


根据标准, std::random_device 按以下方式工作:

result_type operator()();

返回: 非确定性随机值,均匀分布在 min() 和 max(), 包括的。它是实现定义的     如何生成这些值。

并且有几种方法可以使用它。播种引擎:

std::mt19937 eng(std::random_device{}());

作为引擎本身:

std::uniform_int_distribution<> uid(1, 10);
std::cout << dist(dev);

因为它是实现定义的,所以听起来不像说的那么强大 std::seed_seq 要么 srand(time(nullptr))。我更愿意将它用作种子,作为引擎还是根本不用?


12739
2017-12-15 20:42


起源

不幸的是,你必须要小心。例如, MinGW没有实现 std::random_device 好。 - Fred Larson
我会选择第一个选项,但这也取决于你想要种子引擎的质量。 - didierc
它可能比那些不具有加密强度的技术更强大。例如Visual C ++使用 RtlGenRandom。 - Chuck Walbourn
我怀疑你在没有指定编译器/平台的情况下会得到一个有意义的答案 - 否则最好的答案是检查编译器的文档以获取具体信息。 - MrEricSir
来源说 random_device 用于获取随机位的是实现定义的。因此,如果您的实现使用 /dev/random 代替 /dev/urandom,调用可能会阻塞,直到你补充熵池,这可能意味着你将花费大量时间摆动你的鼠标:) - Praetorian


答案:


一般来说, std::random_device 应该是您可以在您的平台上访问的最真实的随机信息的来源。话虽这么说,访问它比慢 std::mt19937 或者不是。

正确的行为是使用 std::random_device 种子之类的东西 std::mt19937


14
2017-12-15 20:46



如果我没错的话, std::random_device 如果你试图从中获取大量数字,可能会耗尽熵。这可能会导致它阻塞,直到您移动鼠标或其他东西。 - Fred Larson
应该 是的,但有时不是。看到 stackoverflow.com/questions/18880654/... - Mark Ransom