Random-Generation

Xorshift RNG 對於蒙特卡洛方法是否足夠好?如果不是,有什麼替代品?

  • October 18, 2012

我最近偶然發現了一篇關於 Java 中偽隨機數的文章,其中提到了默認算法中的潛在弱點,稱為線性同餘生成器 (LCG),並提供了一些替代方案。其中我發現Xorshift 生成器很有趣。所以我戴上我的研究員的帽子,潛入尋找更多信息。

事實證明,它實現起來非常簡單,運行時速度非常快,聽起來很棒。問題是該方法是否比默認的 LCG 算法有顯著的改進。為了弄清楚這一點,我通讀了Marsaglia 介紹該方法的原始論文,以及Panneton 和 L’ecuyer的相當嚴厲的批評/分析。我不能聲稱我一直遵循數學,所以我不確定該方法是否比 LCG 更上一層樓,這讓我想到了我的第一個問題:

問題 1: Xorshift 是否比java 使用的基於 LCG 的默認 RNG更上一層樓?

Panneton 和 L’ecuyer 提出了參數選擇的問題,並指出僅 3 位移位可能還不夠。我最近對哈希函數進行了一些研究(這是我在 StackOverflow 上提出的一個相關問題)。我想知道是否可以通過這樣的方式改進 3-bitshift 方法?

long lhash = prime * (hash1 ^ hash2);然後使用(int)((lhash >> 32) ^ lhash)

根據@whuber 的評論,更改 RNG 的具體細節是一件棘手的事情,因此這可能會很棘手,但我會很感激任何關於如何修正 Xorshift RNG 中的弱點的想法/線索。***問題2:***可以做些什麼來提高Xorshift算法的“整體性能”?(請注意,我在這裡不是指計算性能)

最後一點,我想做的是生成偽隨機 Gussians,以模擬鍵入數字,其中rand是高斯與. 出於這個原因,我不太熱衷於添加依賴項,而且我還認為在這一點上使用SecureRandom有點矯枉過正。

http://prng.di.unimi.it/,您可以找到使用 TestU01 測試的幾個隨機數生成器的槍戰,TestU01 是用於取代頑固和頑固的偽隨機數生成器的現代測試套件。

Java LCG 生成器不可用。你應該像避免瘟疫一樣避免它。xorshift 生成器更好,但仍會顯示幾個統計工件。Marsaglia 在他的原始論文中建議將 xorshift 生成器的結果乘以一個常數以提高統計質量,結果就是 xorshift* 生成器。這些是一些最快的高質量發電機,特別是如果週期相當大。

使用 SecureRandom 生成大量隨機位是極其危險的。在幾十萬次調用(或更少)之後,您的應用程序將停止(至少在 Linux 上)等待 /dev/random 提供更多真正的隨機位。如果您不知道,調試將是一場噩夢——應用程序將毫無理由地掛起並使用 0% 的 CPU。

引用自:https://stats.stackexchange.com/questions/40680

comments powered by Disqus