2013-03-12 135 views
0

看看我們的應用程序中的一些遺留代碼,發現這個奇怪的實現正常RNG。我想換一個適當的Box-Muller轉換,但需要一些鼓勵。通過平均5個均勻樣本的正態隨機數?

如您所見,它會從-3.875到+3.875生成5個隨機數,然後對它們進行平均以獲得從-1到+1的準正態分佈值。這可能是正確的嗎?這怎麼能工作?爲什麼5個樣本?

有人請解釋:

private double GetRandomNormalNumber() 
    { 
     const double SPREAD = 7.75; 
     const double HALFSPREAD = 3.875; 
     var random = new Random(); 

     var fRandomNormalNumber = ((random.NextDouble()*SPREAD - HALFSPREAD) + 
           (random.NextDouble()*SPREAD - HALFSPREAD) + 
           (random.NextDouble()*SPREAD - HALFSPREAD) + 
           (random.NextDouble()*SPREAD - HALFSPREAD) + 
           (random.NextDouble()*SPREAD - HALFSPREAD) 
           )/5; 

     return fRandomNormalNumber; 
    } 

回答

2

逼近通過平均幾個隨機均勻樣本正態分佈爲標準,在Central Limit Theorem的結果。通常採集12個樣本。就你的情況而言,有人可能爲了效率而決定只取5個樣本。

,看一下Generate random numbers following a normal distribution in C/C++

+0

感謝您參考中心極限定理我正在尋找的 – zvolkov 2013-03-12 15:35:50

+1

請注意,12個數字通常不是完全由於CLT而被採用,而是因爲從[0..1]開始的_single_ uniform隨機變量是1/12(因爲它是E [x^2] -E [x]^2 = 1/3-1/4 = 1/12),所以12數字給出1的差異。所以當你添加12個和減去6,您會得到_standard_正態隨機變量,其中mean = 0且variance = 1。 – andreister 2014-01-12 19:26:33

1

的代碼似乎是正確的,它只是使周圍0.0面積比(-HALFSPREAD,HALFSPREAD)範圍的邊緣概率較高。

我懷疑的5個號碼是一個很好的計算值,最有可能的被選擇「因爲它的工作原理」

如果你對更換一個RNG,你應該能夠:只要更換了沒有人應該依賴現有RNG的特定輸出,更好的實際特徵值