如何在C或C ++中正常分布后輕松生成隨機數?我不想使用Boost。我知道Knuth詳細談論了這個問題,但我現在還沒有他的書。
3 回答

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
有許多方法可以從常規RNG生成高斯分布數。
該箱穆勒變換是常用的。它正確生成具有正態分布的值。數學很容易。您生成兩個(統一)隨機數,并通過對它們應用公式,您將獲得兩個正態分布的隨機數。返回一個,并保存另一個以獲取隨機數的下一個請求。

慕森卡
TA貢獻1806條經驗 獲得超8個贊
C ++ 11
C ++ 11提供的std::normal_distribution,這就是我今天要走的路。
C或更舊的C ++
以下是按復雜程度遞增的順序解決方案:
從0到1添加12個均勻隨機數并減去6.這將匹配正常變量的均值和標準差。一個明顯的缺點是范圍限制在±6 - 與真正的正態分布不同。
Box-Muller變換。這在上面列出,并且實現起來相對簡單。但是,如果您需要非常精確的樣本,請注意Box-Muller變換與一些統一的生成器相結合會遭受稱為Neave Effect 1的異常現象。
為了獲得最佳精度,我建議繪制制服并應用反向累積正態分布來得到正態分布的變量。這是一個非常好的逆累積正態分布算法。
1. HR Neave,“使用具有乘法同余偽隨機數發生器的Box-Muller變換”,Applied Statistics,22,92-97,1973
- 3 回答
- 0 關注
- 1120 瀏覽
添加回答
舉報
0/150
提交
取消