A. 如何產生正態分布的隨機數
•最簡單的:rejection sampling,思路很簡單,也很容易實現,但效率較差
•較復雜的:inverse CDF,直接利用累積分布函數(CDF)的反函數生成隨機數,但計算中牽扯到比較復雜的誤差函數erf(非初等函數)
•更好的:Box-Muller演算法,在很長時間內都是生成正態分布隨機數的"標准"演算法。Box-Muller演算法的特點是效率高,並且計算過程比較簡單(只用到了初等函數)。參見:Box-Muller transform
•目前最好的(相較於其它實用演算法):ziggurat演算法,效率很高,很多現代的編程語言都使用了這一演算法。ziggurat並不是人名,其含義是「金字形神塔」,不是埃及那個金字塔,而是古代蘇美爾人建造的類金字塔結構的神壇:神壇由多層平台構成,每層平台都呈矩形、卵形或正方形,且自下而上面積逐漸減小。ziggurat演算法實際上是一種改進的、包含查表操作的rejection sampling。
B. 如何產生正態分布的隨機數
這個要看你的具體需求,有幾種方法可以推薦。
首先最簡單:rejection sampling,思維方式非常簡單,容易實現,但效率很差更復雜:逆提供,直接使用累積分布函數的逆函數(CDF)生成隨機數,但涉及更復雜的計算誤差函數的小塊土地(非初等函數)更好:盒子-穆勒演算法,生成在很長一段時間的正態分布隨機數的「標准」演算法。
所以不管是那種演算法,都需要你去花些功夫來了解一下,是不是適合自己,是不是適合去解決現在自己正在面臨的問題,畢竟別的經驗都只是一些參考。在自己的實踐中逐步去發現自己的問題,找到最適合自己的很重要