簡體   English   中英

如何測試浮點隨機數生成器?

[英]How can I test a floating-point random number generator?

我為 128 位浮點運算編寫了Java class 在其他方法中,它具有旨在生成范圍[0, 1.0)中的偽隨機值的方法。 雖然我使用了我認為足夠可靠的標准java.util.Random class,但我從中構造我的 Quadruple class 值的方式可能會出現錯誤。 所以我想確保它返回的隨機值足夠隨機。 我已經使用卡方標准檢查了 10_000 個子范圍的幅度分布,並檢查了尾數的每個位 position 中1的頻率,並且我用肉眼查看了數字的十六進制表示,這就是我能想到的。 到目前為止,一切看起來都很好。

但是這些測試並沒有檢查偽隨機數的許多其他可能的缺陷(例如,尾數位之間可能存在的相關性,或者只是短序列值的重復)。 有什么方法可以更仔細、更全面地測試這些數字的序列嗎? 如果它與問題相關,則這種類型的數字的值在內部存儲為尾數的 128 位(兩個long s)和指數的 32 位。

當我處理自定義或自己的 PRNG 時,我總是這樣做:

  1. 檢查直方圖

    這將確認隨機分布......所以只需為您的范圍創建箱並計算有多少 PRNG 數字在 N 點中擊中每個箱,然后 plot 結果

  2. 做一個“隨機” plot

    只需做一個 2D 點 plot ,其中x軸是迭代(或訂單號/索引), y軸是 PRNG 值。 像這樣的東西:

     for (x=0;x<100000;x++) { y=Random(); RenderPixel(x*xscale,y*yscale,some_color); }

    這將生成圖像,您可以在其中非常容易地發現重復模式(以防 PRNG 配置錯誤)。 這里的簡單無符號 integer PRNG 示例來自此答案

    uint PRNG

您可以結合 plot 以及計算基本統計屬性來檢查 PRNG 的質量。 這是我很久以前編寫的一個古老的學校項目中的一個例子:

PRNG 圖

點是“隨機性”plot, Aqua是所需的分布,黃色是直方圖。 如果您在該動畫 GIF 中看到大部分白框,請下載並在圖片查看器中查看(因為 Brownsers 最近添加了另一個 GIF 解碼錯誤)

暫無
暫無

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

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