当我使用std::random生成随机数时,我应该选择哪个引擎?是std::default_random_engine还是std::mt19937?它们有什么区别?
当我使用std::random生成随机数时,我应该选择哪个引擎?是std::default_random_engine还是std::mt19937?它们有什么区别?
对于轻量级的随机数(例如游戏),您可以考虑使用default_random_engine
。但是,如果您的代码严重依赖随机性的质量(例如模拟软件),则不应该使用它,因为它只提供最小保证:
这是库实现选择至少提供相对轻松、非专业和/或轻量级使用的引擎行为。
另一方面,mt19937
32位Mersene扭曲器(或其64位版本mt19937_64
)是一个众所周知的算法,非常适合通过统计随机性测试。因此,它非常适合于科学应用。
然而,如果您的随机数是用于安全性(例如加密)目的,则两者都不应考虑。
std::default_random_engine
是客观上一个不好的选择,因为你不知道得到什么结果,切换标准库可能会给你不同的随机性质量结果。std::mt19937
,因为它能提供可预测和定义良好的行为。它们解决不同的需求。前者是对某个生成器的实现定义别名,而后者则专门使用32位种子的Mersenne-Twister算法。
如果您没有特殊要求,std::default_random_engine
应该可以胜任。
std::default_random_engine
。它是否比std::mt19937
更有优势? - Deqing