透過 MCP 連接 →

輸入計算

數學公式

Show calculation steps (1)
  1. Distribution Statistics

    Distribution Statistics: 對數常態分布亂數產生器

    Theoretical mean, median, and variance of the log-normal distribution from mu and sigma.

廣告

結果

已產生的對數常態亂數
10
個正值對數常態變量(Box-Muller)
0.5.134215966
1.0.5321354119
2.0.2753957901
3.0.1197636250
4.30.01854834
5.1.091897897
6.5.660117901
7.1.558084663
8.0.06768486599
9.233.4870779
Theoretical mean E[X] = exp(μ + σ²/2) 20.085537
Theoretical median = exp(μ) 2.718282
理論變異數 Var[X] 21,623.037001

這個產生器的功能

這個工具會產生一串符合對數常態分布(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.$$
將兩個均勻隨機數轉換為對數常態值的 Box-Muller 變換流程圖
兩個均勻隨機數經 Box-Muller 變換成標準常態 \(Z\),再經縮放與指數化得到 \(X\)。

實際範例

設 \(\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)\),因此所有輸出都必定是正數。

最後更新: