在C++ 11中使用哪个伪随机数生成器?

use*_*329 11 c++ random prng c++11

C++ 11附带了一组PRNG.

在什么情况下应该选择一个而不是另一个?它们有什么优点,缺点等等.

Mr.*_*C64 15

我认为Mersenne扭转std::mt19937引擎就像"默认"PRNG一样好.

您可以使用std::random_device获取非确定性种子mt19937.

来自Stephan T. Lavavej的 GoingNative 2013有一个非常有趣的演讲:

rand() 认为有害

您也可以从该网站下载幻灯片.特别是,滑动#23显然比较mt19937random_device:

  • mt19937 是:
    • 快速(499 MB/s = 6.5个周期/字节对我来说)
    • 极高的质量,但不是加密安全
    • 可种子(如果你想要超过32位)
    • 可重复(标准强制算法)
  • random_device 是:
    • 可能很慢(1.93 MB/s = 1683个周期/字节对我来说)
    • 强烈依赖平台(GCC 4.8可以使用IVB RDRAND)
    • 可能是加密安全的(检查文档,对VC来说是真的)
    • 不可种子,不可重复