這個產生器的功能
這個工具會產生一串符合對數常態分布(Log-Normal Distribution)的偽隨機數。當一個隨機變數 \(X\) 的自然對數 \(\ln(X)\) 呈常態分布時,\(X\) 就屬於對數常態分布。產生器會先以經典的 Box-Muller 轉換製造標準常態變量,再將其縮放到目標常態分布 \(N(\mu, \sigma^2)\),最後取指數,得到必定為正值的對數常態數值。
重點:μ 與 σ 究竟代表什麼
參數 \(\mu\) 與 \(\sigma\) 描述的是 \(\ln(X)\) 所對應的底層常態分布,並不是 \(X\) 本身的平均數與標準差,這點務必留意。\(X\) 真正的平均數為 \(\exp(\mu + \sigma^2/2)\),中位數為 \(\exp(\mu)\),變異數則是 \((\exp(\sigma^2) - 1)\cdot\exp(2\mu + \sigma^2)\)。這些理論參考值會與你的抽樣結果並列顯示,方便你檢查輸出是否合理。
$$\begin{aligned} \text{Mean} &= \exp\!\left(\mu + \tfrac{1}{2}\sigma^{2}\right) \\ \text{Median} &= \exp\!\left(\mu\right) \\ \text{Var} &= \left(e^{\sigma^{2}} - 1\right) e^{\,2\mu + \sigma^{2}} \end{aligned}$$使用方式
輸入 \(\mu\)(任意實數)、\(\sigma\)(零或正數),以及想要產生的數量(1 到 1000 個)。接著選擇要顯示幾位有效數字。每次執行都會重新抽取均勻亂數,因此每回的結果都不相同。由於 Box-Muller 法每對均勻亂數可產生兩個常態變量,若輸入的數量為奇數,多出的那一個變量便會直接捨棄。
公式解析
對於落在 \((0,1]\) 的均勻亂數 \(U_1\)、\(U_2\):\(Z = \sqrt{-2\ln U_1}\,\cos(2\pi U_2)\) 會得到 \(Z \sim N(0,1)\)。接著 \(Y = \mu + \sigma\cdot Z\) 即為 \(N(\mu, \sigma^2)\),而 \(X = \exp(Y)\) 便是對數常態值。為了避免出現 \(\ln(0)\),我們會將 \(U_1\) 限制在一個極小的 epsilon 之上。
$$X = \exp\!\left(\mu + \sigma\, Z\right) \\[1.5em] \text{where}\quad \left\{ \begin{aligned} Z &= \sqrt{-2\ln U_1}\,\cos(2\pi U_2) \\ U_1, U_2 &\sim \text{Uniform}(0,1) \end{aligned} \right.$$
實際範例
設 \(\mu = 1\)、\(\sigma = 2\),並取 \(U_1 = 0.5\)、\(U_2 = 0.25\)。則 \(R = \sqrt{-2\ln 0.5} = 1.17741\)。\(Z_1 = R\cdot\cos(\pi/2) = 0\),\(Z_2 = R\cdot\sin(\pi/2) = 1.17741\)。因此 \(X_1 = \exp(1) = 2.71828\),\(X_2 = \exp(1 + 2\cdot 1.17741) = \exp(3.35482) \approx 28.64\)。理論平均數 \(\exp(3) = 20.0855\) 與中位數 \(\exp(1) = 2.71828\) 都與結果一致。
常見問題
為什麼每次執行的數值都不一樣?這是使用 Math.random() 的隨機產生器;在沒有固定種子(seed)的情況下,每次執行的結果自然都會不同。
如果 sigma = 0 會怎樣?此時分布會退化(degenerate),所有數值都會等於 \(\exp(\mu)\)。
數值有可能是負數嗎?不會——對數常態分布的值域為 \((0, \infty)\),因此所有輸出都必定是正數。