在C++11中使用哪个伪随机数生成器
Which Pseudo-Random Number Generator to use in C++11?
C++11附带了一组PRNG。
在什么情况下应该选择一个而不是另一个?它们的优点、缺点等是什么?
我认为Mersenne twisterstd::mt19937
引擎可以作为"默认"PRNG。
您只需使用std::random_device
即可获得mt19937
的非确定性种子。
有一个非常有趣的谈话来自GoingNative 2013由StephanT.Lavavej:
rand()
被认为是有害的
您也可以从该网站下载幻灯片。特别是,幻灯片23清楚地比较了mt19937
与random_device
:
mt19937
为:
- 快速(499 MB/s=6.5个周期/字节)
- 极高的质量,但在加密方面不安全
- 可设定种子(如果需要,可以超过32位)
- 可复制(标准强制算法)
random_device
为:
- 可能较慢(1.93 MB/s=1683个周期/字节)
- 强烈依赖于平台(GCC 4.8可以使用IVB RDRAND)
- 可能是加密安全的(查看文档,对VC来说是正确的)
- 不可播种、不可再生
权衡的是速度、内存足迹和PRNG周期。
-
线性同余生成器:快速、低内存、小周期
-
滞后Fibonacci(带进位减法):快速、大内存、大周期
-
Mersenne Twister:慢速、超大内存、超大周期
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 制作具有平均值的随机数生成器
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 尝试在 c++ 中创建随机数生成器并收到错误
- 存储并重新加载随机数生成器状态
- 作为随机数生成器的争用条件
- 播种随机数生成器以使用分叉的好方法是什么?
- 随机数生成器的性能因平台而异
- 随机数生成器的种子和状态有什么区别?
- RcppShark 随机森林示例引发有关随机数生成器的异常
- C++多个实例的随机数生成器组种子中增强
- C++随机数生成器仅生成 0 - C++ 11
- GSL+OMP:C++中的线程安全随机数生成器
- 贪吃蛇游戏 - 食物瓷砖的随机数生成器
- 随机数生成器在 C++ 用于 skipList.
- 如何理解C++11随机数生成器
- 在C++11中使用哪个伪随机数生成器
- c++11 子函数中的随机数生成器
- C++11随机数生成器的线程安全性
- c++ -11中使用boost封装的随机数生成器