2016-02-14 55 views
4

我使用VHDL的IEEE.math_real的隨機數字,但這些生成的數字有多好?VHDL的隨機數有多好?

....比方說,相比於rand(...)從C

是否有過統計檢驗?


這裏是高斯分佈的直方圖。通過math_real.Uniform(...)

  • 箱穆勒變換而產生2均勻分佈REAL值
  • 使用REAL
  • 輸出計算響:參數:

      隨機
    • 源0..4095 INTEGER
    • 102.400迭代

    經典直方圖視圖:
    NormalDistributedRandomValue 100Ki iterations; range 0..4095

    作爲點雲:
    NormalDistributedRandomValue 100Ki iterations; range 0..4095


    這裏是均勻分佈的直方圖。參數:

      隨機
    • 源:均勻分佈REAL值通過使用REAL
    • 輸出math_real.Uniform(...)
    • 計算產生響:0..4095 INTEGER
    • 102.400迭代

    經典直方圖視圖:
    NormalDistributedRandomValue 100Ki iterations; range 0..4095

    作爲一個點雲:
    NormalDistributedRandomValue 100Ki iterations; range 0..4095

    的Gnuplot爲f(x)=m*x+b擬合結果:

    m = -0.0000343906 
    b = 25.0704 
    

    在我看來,無論是直方圖具有較高的抖動。

  • +2

    親愛downvoter,如果你留下的理由給予downvote評論,所以這個問題可以改進將是巨大的。 –

    +0

    進行卡方檢驗可以發現抖動/異常值是否在合理範圍內。 –

    +0

    是否可以在Gnuplot中做這樣的測試?我仍在等待我的統一分配完成...我目前的測試顯示重量中心不在2048. – Paebbels

    回答

    2

    IEEE.math_real.UNIFORM實現是:

    procedure UNIFORM(variable SEED1,SEED2:inout POSITIVE;variable X:out REAL) is 
        ... 
        variable Z, K: INTEGER; 
        variable TSEED1 : INTEGER := INTEGER'(SEED1); 
        variable TSEED2 : INTEGER := INTEGER'(SEED2); 
    begin 
        ... 
    
        K := TSEED1/53668; 
        TSEED1 := 40014 * (TSEED1 - K * 53668) - K * 12211; 
        if TSEED1 < 0 then 
        TSEED1 := TSEED1 + 2147483563; 
        end if; 
    
        K := TSEED2/52774; 
        TSEED2 := 40692 * (TSEED2 - K * 52774) - K * 3791; 
        if TSEED2 < 0 then 
        TSEED2 := TSEED2 + 2147483399; 
        end if; 
    
        Z := TSEED1 - TSEED2; 
        if Z < 1 then 
        Z := Z + 2147483562; 
        end if; 
    
        SEED1 := POSITIVE'(TSEED1); 
        SEED2 := POSITIVE'(TSEED2); 
        X := REAL(Z) * 4.656613e-10; 
    end UNIFORM; 
    

    通過這些描述關於實施:

    a)用於該函數的語義由由Pierre L'Ecuyer在「上發表 算法描述ACM的通信 「卷。 31,沒有。 6,June 1988,pp.742-774。 該算法基於兩個 乘法線性同餘發生器的組合,用於32位 平臺。

    b)所述第一呼叫均勻之前,種子值 (SEED1,seed2中)必須在範圍 [1,2147483562]和[1,2147483398]分別初始化爲數值。在每次調用UNIFORM後,修改種子值 。 c)該隨機數發生器對於32位的計算機是便攜式的,並且對於每個 種子值組,其具有〜2.30584 *(10 ** 18)的週期。

    d)有關本算法譜檢驗信息,請參考 到L'Ecuyer製品。

    L'eeyer的論文是"Efficient and portable combined random number generators",由user1155120在評論中給出。

    所以這是一個Combined Linear Congruential Generator (CLCG)使用Wichmann的/希爾/施拉格/ Bratley等。當使用32位整數實現時,避免整數溢出(參見L'eeyer論文)。

    看來,入選CLCG常數是衆所周知的,基於維基和其他參考資料,我可以通過快速搜索找到。當user1155120在註釋中通知時,CLCG的隨機屬性已在"A Comparison of Four Pseudo Random Number Generators Implemented in Ada"中進行了分析。

    在此基礎上,它看來,VHDL隨機生成是非常穩固,所以我會認爲,你發現抖動/離羣只是隨機性的結果。

    +1

    ***有多好,VHDL的隨機數?***,你拿出「非常穩固」和「所以我想」?就高斯抖動而言,使用什麼方法將REAL輸出量化爲4048值整數?在math_real包聲明中提到的1988 ACM [L'ECUYER](https://www.researchgate.net/profile/Pierre_LEcuyer/publication/234789148_L'ecuyer_P_Efficient_and_portable_combined_random_number_generators_Communications_of_the_ACM/links/00b7d5282b5c3da8cb000000.pdf)。它已經[測試](http://actel.kr/_hdl/1/erm1.u-strasbg.fr/vhdl/misc/rnd_gene/random.pdf)(在Ada中)。 – user1155120

    +0

    感謝您提及L'ecuyers原始論文,以及關於測試的論文,並且我已經更新了包含此內容的答案並跳過了我的假設。 –