2012-03-20 53 views
5

我正在玩PRNGs(如Mersenne Twister和stdlib的rand()函數),我想要一個很好的測試來幫助我確定PRNG產生的隨機數據的質量。 我已經計算出使用的的PRNG產生隨機數的Pi的價值,我覺得rand()和梅森難題非常接近提供一個區別(我需要經過10個小數點審議?)。測試PRNG的質量

我對蒙特卡洛模擬沒有太多的想法;請讓我知道一些算法/應用程序(可能簡單但可以提供很好的推論),這將幫助我在質量方面區分它們。


編輯1:我沒注意過,但有一個類似的線程:How to test random numbers?

編輯2:我不能interprete NIST的結果,正如上文其中一條評論。我得到了這個想法,從random.org直觀地解釋模式(如果有的話),並且因爲它很簡單,所以我遵循這一點。我會很高興,如果有人能在我的測試過程中發表評論:

  1. 生成[0,1]使用蘭特()和MT1997
  2. 如果(round(genrand_real1()/rand_0_1()))然後紅色像素,否則黑
  3. ñ隨機量

據我所知,這不是一個非常精確的解決方案,但如果這提供了一個合理的估計,那麼我可以用這個在當下生活。

+0

我不太確定從**僞隨機數發生器**獲得任何**隨機數據** - 但我想你可以實現http://en.wikipedia.org/wiki/Fair_coin#Fair_results_from_a_biased_coin .. – Aprillion 2012-03-20 01:36:48

+0

你是說因爲PRNG產生的價值是可以預測的嗎?謝謝 – Sayan 2012-03-20 01:40:54

+0

是的,這就是區別 - 它只是提醒您檢查一下PRNG是否足夠適合您的應用程序,並且您不需要像[random.org]這樣的TRNG(http://random.org ) – Aprillion 2012-03-20 11:14:03

回答

5

有兩個測試隨機數的標準測試套件。

  1. NIST測試套件。他們有一個implementation in C.
  2. Diehard Test Suite(喬治馬爾薩利亞開發)。這些測試有一個C library實施。

Dieharder庫有一個R接口,名爲RDieHarder。該庫提供了NIST和Diehard測試套件的接口。

+0

我正在使用NIST,但我認爲雖然我的測試通過了,但還是有一些問題;你能幫忙嗎? - 我生成了很長的隨機值,並將它們轉換爲二進制文件並存儲在一個文件中。假設文件中有100個隨機文件,我確實評估了100,並按照文檔「運行測試代碼」部分中的步驟進行操作(選擇生成的比特流爲10,如文檔中所示)。但是我發現我的默認測試用例的「finalAnalysisReport.txt」幾乎不包含任何信息。 – Sayan 2012-03-21 15:39:08

+0

你最好打賭是問另一個問題。 – csgillespie 2012-03-21 21:27:04

+1

這個答案很好,但現在已經過時了。查看更新的其他答案(TL; DR:L'Ecuyer's TestU01,或PractRand)。 – Fab 2016-07-05 12:08:17

1

你最好尋找到volume 2 of the Knuth's series

較短讀,仰望數值方法的相應章節。

如果您只對MC模擬的一種基線感興趣 - 線性同餘發生器是最好的避免,Mersenne Twister在大多數情況下足夠好

+0

你能否給出一個關於LGC最好避免用於蒙特卡羅模擬的證據的鏈接? – ziggystar 2013-08-19 08:58:48

+0

@ziggystar:好吧,你可以在Knuth看看。或數字食譜。或者谷歌了標準測試套件的結果,例如從csgillespie的答案。 – 2013-09-20 23:38:58

6

有幾個統計測試套件可用。我寫,複製,以及以其他方式聚集在一起120米的PRNG和測試的每種,每個測試套件給予每PRNG 4小時各種測試套件的:

  • PractRand(標準,1兆兆字節)發現偏壓在78周的PRNG
  • TestU01(BigCrush)發現50周的PRNG
  • RaBiGeTe(擴展,512兆比特,X1)偏壓發現偏壓在40周的PRNG
  • Dieharder(定製命令行選項)發現偏壓在25周的PRNG
  • Dieharder(-a命令行選項)發現,在13周的PRNG
  • NIST STS(默認情況下,64兆X128)偏置發現11周的PRNG

有多少的人在的PRNG偏見,其他測試套件都錯過了什麼?

  • PractRand(standard,1 terabyte)發現了22種獨特的偏見,有很多不同的類別。 RaBiGeTe(擴展的512兆位,x1)發現了5種獨特的偏見,所有這些都在LCG和LCG組合中。
  • TestU01 BigCrush發現2個獨特的偏見,都在小混亂PRNGs。
    沒有其他測試套件發現任何獨特的偏見。

總之,只有PractRand,TestU01和可能的RaBiGeTe值得使用。

完全披露:我寫了PractRand,所以無論是PRNG集合還是任何其他非定性指標都可能偏向於它。

其他優點:

  • PractRand和TestU01往往是最容易解釋的輸出在我看來。
  • 我認爲,PractRand和Dieharder是通過命令行界面自動化測試的最簡單方法。
  • PractRand和RaBiGeTe是唯一支持多線程測試的軟件。

其他缺點:

  • PractRand所需的輸入的多個比特比其他測試套件,以測試 - 可能是一個問題,如果您的RNG很慢或上產生的數據量,否則限制。
  • RaBiGeTe和NIST STS都有界面問題。
  • Dieharder和NIST STS都有假陽性問題。
  • 在我看來,NIST STS的接口最差。
  • 我無法讓Dieharder在Windows上編譯。我設法讓TestU01在Windows上編譯,但它花了一些工作。
  • RaBiGeTe的最新版本是閉源版和僅限Windows版。

測試的組的PRNG的: 所述PRNG組包括1個大GFSR,1個大LFSR,4 xorshift類型的PRNG,2周xorwow類型的PRNG,3其他未相當-LFSR的PRNG。它包括10個簡單的2功率模數LCG(其丟棄低位以達到可接受的質量水平),10個2冪模數非完全LCG以及主要基於LCG和不相當LCG的9個組合發生器。它包括19個強度較低的CSPRNG版本,以及一個完整強度的CSPRNG。其中14個基於間接/動態S盒(例如RC4,ISAAC),4個是ChaCha/Salsa參數化,其餘2個是Trivium變體。它包括11個大致可分類爲LFib型或類似的PRNG,不包括LFSR/GFSR。其餘(約35)是小狀態混沌PRNGs,其中10個使用乘法,其他則僅限於算術邏輯和按位邏輯。

編輯:gjrand也有測試集,這是非常模糊,有點奇怪,但實際上做得非常好。

此外,測試的所有PRNGs都包含在PractRand中作爲不推薦的PRNG。

+0

但是,我很高興推薦您的答案,因爲沒有任何證據。你能提供鏈接到論文,支持你的要求嗎?或者關於如何重複實驗的一些說明。 – csgillespie 2016-07-06 11:00:49

+0

請參閱http://pracrand.sourceforge.net/Tests_results.txt – user3535668 2016-07-07 17:28:01

+0

這應該是公認的答案。 – plasmacel 2017-06-04 02:47:55