何时使用std::random_device?

11

根据标准,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_seqsrand(time(nullptr)) 那么强。我应该将其用作种子,作为引擎还是根本不使用?


1
不幸的是,你必须小心谨慎。例如,MinGW没有很好地实现std::random_device。(请参考:https://dev59.com/ZWMk5IYBdhLWcg3w5Bzy) - Fred Larson
我会选择第一种选项,但这也取决于您想要使用的引擎质量。 - didierc
它可能比那些不具有加密强度的技术更加强大。例如,Visual C++使用RtlGenRandom - Chuck Walbourn
我怀疑您在没有指定编译器/平台的情况下很难得到有意义的答案——否则最好的答案是查阅您编译器的具体文档。 - MrEricSir
3
random_device 使用获取随机比特的源是由实现定义的。因此,如果您的实现使用 /dev/random 而不是 /dev/urandom,则调用可能会阻塞,直到您填充熵池,这可能意味着您需要花费很多时间摇动鼠标 :) - Praetorian
1个回答

14

通常来说,std::random_device 应该是您可以在平台上访问的最真实随机信息的来源。尽管如此,与 std::mt19937 等相比,访问它会慢得多。

正确的行为是使用 std::random_device 作为类似于 std::mt19937 的种子。


1
如果我没记错的话,std::random_device 在尝试获取大量数字时可能会耗尽熵。这可能会导致它阻塞,直到您移动鼠标或其他操作。 - Fred Larson
1
应该是,但有时并不是。请参见https://dev59.com/ZWMk5IYBdhLWcg3w5Bzy。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接