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

时间:2014-03-01 08:02:40

标签: c++ c++11 random prng

C ++ 11带有一套PRNG。

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

2 个答案:

答案 0 :(得分:15)

我认为 Mersenne twister std::mt19937 引擎就像“默认”PRNG一样好。

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

2013年GoingNative上有一个非常有趣的演讲 Stephan T. Lavavej

  

rand() Considered Harmful

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

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

答案 1 :(得分:2)

权衡是速度,记忆足迹和PRNG的时期。

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

  2. Lagged Fibonacci(随身携带减去):快速,大记忆,大周期

  3. Mersenne Twister:缓慢,非常大的记忆,非常大的时期