為了方便后面的描述,我們先定義正態分布的兩個參數為: 均值mean表示為 \(\mu_N\), 標准差standard deviation 表示為 \(\sigma_N\) (對應方差Variance表示為 \(\sigma^2_N\))。
為了區分,我們用\(m\)和\(v\) 分別表示對數正態分布的均值和方差, 他們與其對應的正太分布的關系如下:
lognormal均值: \(m_{LogN} = e^{\mu_N+\sigma_N^2/2}\);
lognormal方差: \(v_{LogN} = (e^{\sigma_N^2}-1)e^{2\mu_N+\sigma_N^2}\).
另外:
lognormal 眾數(mode) = \(e^{\mu_N- \sigma_N^2}\);
lognormal 中位數(median) = \(e^{\mu_N}\).
生成符合lognromal distribution 的隨機數(\(n\)個數),無論是Python還是Matlab, 都利用\(\mu_N\)和\(\sigma_N\)來生成對數正態分布隨機數:
- Python (numpy)
import numpy as np
y0 = np.random.lognormal(mu_N, sigma_N, n)
示例:我們取\(\mu_N = 0.5\), \(\sigma_N= 0.5\), \(n = 10000\), 執行並畫出Python生成的隨機數histogram (bin數量取50)如下:

- Matlab
%% method 1: build-in matlab makedist function
pd = makedist('Lognormal', 'mu' ,mu_N,'sigma',sigma_N);
rng('default'); % For reproducibility
y1 = random(pd,n,1);
% logx = log(y1); %logx distributed as normal distribution with mu and sigma
% mean(logx); % 可以驗證為 mu_N
%% method 2: build-in matlab lognrnd function
rng('default'); % For reproducibility
y2 = lognrnd(mu_N, sigma_N, [n,1]);
%% method 3: from normal distriution
rng('default'); % For reproducibility
z = randn([n,1]); %standard normal
x = mu_N + sigma_N.*z;% x follows normal distribution N(mu_N, sigma_N)
y3 = exp(x); % y follows lognormal distribution
示例:我們取\(\mu_N = 0.5\), \(\sigma_N= 0.5\), \(n = 10000\), 執行並畫出Matlab生成的隨機數histogram (bin數量取50)如下:

