C ++ 11带有一套PRNG。
在什么情况下应该选择一个而不是另一个?它们有什么优点,缺点等。
答案 0 :(得分:15)
我认为 Mersenne twister std::mt19937
引擎就像“默认”PRNG一样好。
您可以使用 std::random_device
获取mt19937
的非确定性种子。
2013年GoingNative上有一个非常有趣的演讲 Stephan T. Lavavej :
您也可以从该网站下载幻灯片。特别是,幻灯片#23清楚地比较了mt19937
与random_device
:
mt19937
是:
- 快速(499 MB / s = 6.5周期/字节对我来说)
- 质量非常高,但不加密安全
- 可种子(如果需要,可超过32位)
- 可重复(标准强制算法)
random_device
是:
- 可能很慢(1.93 MB / s = 1683个周期/字节对我来说)
- 强烈依赖平台(GCC 4.8可以使用IVB RDRAND)
- 可能加密安全(检查文档,对VC来说是真的)
- 不可种子,不可再生
答案 1 :(得分:2)
权衡是速度,记忆足迹和PRNG的时期。
线性同余生成器:快速,低内存,小周期
Lagged Fibonacci(随身携带减去):快速,大记忆,大周期
Mersenne Twister:缓慢,非常大的记忆,非常大的时期