[英]Which Pseudo-Random Number Generator to use in C++11?
C ++ 11附帶了一組PRNG。
在什么情況下應該選擇一個而不是另一個? 它們有什么優點,缺點等等。
我認為Mersenne twister std::mt19937
引擎就像“默認”PRNG一樣好。
你可以只使用std::random_device
獲得非確定性種子mt19937
。
來自Stephan T. Lavavej的 GoingNative 2013有一個非常有趣的演講:
您也可以從該網站下載幻燈片。 特別是,幻燈片#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的時期。
線性同余生成器:快速,低內存,小周期
滯后斐波納契(隨運載減):快速,大內存,大周期
Mersenne Twister:緩慢,非常大的記憶,非常大的時期
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.