簡體   English   中英

在C ++ 11中使用哪個偽隨機數生成器?

[英]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有一個非常有趣的演講:

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. 滯后斐波納契(隨運載減):快速,大內存,大周期

  3. Mersenne Twister:緩慢,非常大的記憶,非常大的時期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM