【问题标题】:Should I use std::default_random_engine or should I use std::mt19937?我应该使用 std::default_random_engine 还是应该使用 std::mt19937?
【发布时间】:2015-07-26 06:43:13
【问题描述】:

当我想使用 std::random 生成随机数时,我应该更喜欢哪个引擎? std::default_random_engine 还是 std::mt19937?有什么区别?

【问题讨论】:

  • 查阅文档。随机数生成器的选择取决于您的具体情况。也就是说,Mersenne Twister 通常是一个很好的起点。
  • 我很好奇什么时候应该选择std::default_random_engine。和std::mt19937相比有什么优势吗?

标签: c++


【解决方案1】:

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

这是库实现对生成器的选择 为相对随意的情况提供至少可接受的引擎行为, 不熟练和/或轻量级使用

mt19937 32 位 mersene 捻线器(或它的 64 位对应物 mt19937_64)在另一边是 well known algorithm,它通过了很好的 statistical randomness tests。所以它是科学应用的理想选择。

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

【讨论】:

    【解决方案2】:

    该问题目前以主要意见为基础进行一次接近投票。我会反对这一点,并说std::default_random_engine 在客观上是一个糟糕的选择,因为您不知道自己得到了什么,并且切换标准库会给您收到的随机质量带来不同的结果。

    你应该选择任何随机数生成器给你你正在寻找的那种品质。如果您必须在两者之间进行选择,请使用 std::mt19937,因为它可以为您提供可预测和明确的行为。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-03-13
        • 2023-02-09
        • 1970-01-01
        • 2011-09-09
        • 2014-03-25
        • 2014-11-09
        • 2012-08-02
        • 1970-01-01
        相关资源
        最近更新 更多