蒙地卡羅法與隨機化方法

Box-Muller 轉換(Box-Muller transform)

/ BOKS MUL-er /

常態(鐘形曲線)分布是整個模擬領域最常需要的形狀,偏偏它正是反轉換取樣最棘手的那一個,因為它的累積函數沒有閉式反函數。Box-Muller 轉換就是那個漂亮的繞道:它只用一個對數、一個平方根,以及一個正弦和餘弦,就把兩個普通的均勻數變成兩個獨立的標準常態數——一條閉式公式,不必求根、不必特殊函數。

整個方法如下。抽兩個獨立的均勻數 u_1 與 u_2 落在 (0, 1)。算 R = sqrt(-2 * ln(u_1)) 與 theta = 2 * pi * u_2。則 z_1 = R * cos(theta) 與 z_2 = R * sin(theta) 是兩個來自標準常態 N(0, 1) 的獨立抽樣。這個把戲利用一個漂亮的事實:若你在平面上放一個二維高斯,其半徑平方 R^2 服從指數分布、其角度 theta 服從均勻分布——而且兩者完全獨立。於是對半徑取樣(透過指數分布,反轉法輕鬆得到 -2 ln u_1)與對角度取樣(均勻),再由極座標換回直角座標,你就落在一個真正的二維高斯上,其兩個座標是獨立的常態數。

它精確、簡短,是亂數函式庫的常備。兩則誠實的附註。其一,三角版本正確,但 sin 與 cos 可能慢;「極座標」(Marsaglia)變體用一個小小的拒絕步驟避開它們,而現代函式庫常改用更快的 Ziggurat 演算法。其二,當心一個微妙的浮點陷阱:若 u_1 可能剛好等於 0,則 ln(0) 是負無窮,結果是垃圾,所以實作會從 (0, 1] 抽 u_1,或對零加以防護。有了標準常態數,縮放再平移(mu + sigma * z)就能得到你要的任何常態分布。

取 u_1 = 0.5、u_2 = 0.25。則 R = sqrt(-2 * ln 0.5) = sqrt(1.386) = 1.177,theta = 2 * pi * 0.25 = pi/2。於是 z_1 = 1.177 * cos(pi/2) = 0、z_2 = 1.177 * sin(pi/2) = 1.177——由一對均勻數得到兩個標準常態抽樣。

兩個均勻數進、兩個獨立常態數出——透過一個半徑與一個角度。

若 u_1 可能剛好為 0,ln(u_1) 是負無窮,樣本就壞了——請從 (0,1] 抽或對零加以防護。基本三角版的 sin/cos 成本,使多數函式庫改採極座標變體或 Ziggurat 法。

又稱
Box-Muller methodpolar method (variant)Box-Muller 方法盒-穆勒變換