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

时间:2015-05-14 15:13:29

标签: c++

当我想使用std :: random生成随机数时,我更喜欢哪种引擎? std::default_random_enginestd::mt19937?有什么区别?

3 个答案:

答案 0 :(得分:14)

对于轻量级随机(例如游戏),您当然可以考虑default_random_engine。但是如果你的代码在很大程度上取决于随机性的质量(例如模拟软件),你就不应该使用它,因为它只提供简约的保证:

  

这是图书馆实施者对发电机的选择   为相对随意提供至少可接受的引擎行为,   不熟练和/或轻量级使用

mt19937 32位mersene twister(或其64位对应mt19937_64)在另一侧well known algorithm传递得很好statistical randomness tests。因此,它是科学应用的理想选择。

但是,如果您的随机数用于security(例如加密)目的,则您不应考虑它们。

答案 1 :(得分:3)

这个问题目前正以一个主要意见为基础进行一次密切投票。我反对这一点,并说std::default_random_engine客观上是一个糟糕的选择,因为你不知道你得到了什么,切换标准库可以给你不同的结果,你得到的随机性质。

你应该选择任何随机数生成器为你提供你想要的那种品质。如果您必须在两者之间进行选择,请使用std::mt19937,因为它为您提供了可预测和定义的行为。

答案 2 :(得分:1)

他们满足不同的需求。第一个是某个生成器的实现定义别名,而后者专门使用Mersenne-Twister算法和32位种子。

如果您没有特殊要求,std::default_random_engine应该没问题。