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

Which Pseudo-Random Number Generator to use in C++11?

本文关键字:随机数生成器 C++11      更新时间:2023-10-16

C++11附带了一组PRNG。

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

我认为Mersenne twisterstd::mt19937引擎可以作为"默认"PRNG。

您只需使用std::random_device即可获得mt19937的非确定性种子。

有一个非常有趣的谈话来自GoingNative 2013由StephanT.Lavavej:

rand()被认为是有害的

您也可以从该网站下载幻灯片。特别是,幻灯片23清楚地比较了mt19937random_device:

  • mt19937为:
    • 快速(499 MB/s=6.5个周期/字节)
    • 极高的质量,但在加密方面不安全
    • 可设定种子(如果需要,可以超过32位)
    • 可复制(标准强制算法)
  • random_device为:
    • 可能较慢(1.93 MB/s=1683个周期/字节)
    • 强烈依赖于平台(GCC 4.8可以使用IVB RDRAND)
    • 可能是加密安全的(查看文档,对VC来说是正确的)
    • 不可播种、不可再生

权衡的是速度、内存足迹和PRNG周期。

  1. 线性同余生成器:快速、低内存、小周期

  2. 滞后Fibonacci(带进位减法):快速、大内存、大周期

  3. Mersenne Twister:慢速、超大内存、超大周期