我应该使用std::default_random_engine还是std::mt19937?

29

当我使用std::random生成随机数时,我应该选择哪个引擎?是std::default_random_engine还是std::mt19937?它们有什么区别?


1
请查阅文档。随机数生成器的选择取决于您的特定情况。话虽如此,Mersenne Twister通常是一个很好的起点。 - Bathsheba
我很好奇什么时候应该选择std::default_random_engine。它是否比std::mt19937更有优势? - Deqing
3个回答

25

对于轻量级的随机数(例如游戏),您可以考虑使用default_random_engine。但是,如果您的代码严重依赖随机性的质量(例如模拟软件),则不应该使用它,因为它只提供最小保证:

这是库实现选择至少提供相对轻松、非专业和/或轻量级使用的引擎行为。

另一方面,mt19937 32位Mersene扭曲器(或其64位版本mt19937_64)是一个众所周知的算法,非常适合通过统计随机性测试。因此,它非常适合于科学应用。

然而,如果您的随机数是用于安全性(例如加密)目的,则两者都不应考虑。


8
该问题目前有一个主要基于观点的关闭票。我会反对这一点,并且会说std::default_random_engine是客观上一个不好的选择,因为你不知道得到什么结果,切换标准库可能会给你不同的随机性质量结果。
你应该选择任何能够给你所需随机数生成器的特点的随机数生成器。如果你必须在两者之间选择,那就用std::mt19937,因为它能提供可预测和定义良好的行为。

2

它们解决不同的需求。前者是对某个生成器的实现定义别名,而后者则专门使用32位种子的Mersenne-Twister算法。

如果您没有特殊要求,std::default_random_engine应该可以胜任。


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