通过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.0.4886428830
1.0.7242116656
2.1.689111254
3.0.07843174608
4.10.61542317
5.4.482215618
6.14.66444092
7.0.9321927745
8.0.4358802131
9.1.039704227
Theoretical mean E[X] = exp(μ + σ²/2) 20.085537
Theoretical median = exp(μ) 2.718282
理论方差 Var[X] 21,623.037001

这个生成器能做什么

本工具会生成一组服从对数正态分布的伪随机数。当一个随机变量 \(X\) 的自然对数 \(\ln(X)\) 服从正态分布时,\(X\) 就服从对数正态分布。生成器先用经典的 Box-Muller 变换产生标准正态随机数,再将其缩放为目标正态分布 \(N(\mu, \sigma^2)\),最后取指数运算,从而得到恒为正值的对数正态数据。

标注了均值、中位数和众数的右偏对数正态概率密度曲线
对数正态分布取正值且右偏,满足众数 < 中位数 < 均值。

关键提醒:μ 与 σ 到底代表什么

参数 \(\mu\) 和 \(\sigma\) 描述的是 \(\ln(X)\) 所服从的底层正态分布,而不是 \(X\) 本身的均值和标准差。X 的真实均值为 $$\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}}$$ 这些参考值会与生成的样本一并显示,方便你核对输出结果是否合理。

如何使用

输入 \(\mu\)(任意实数)、\(\sigma\)(零或正数),以及想要生成的数字个数(1 到 1000)。再选择结果保留的有效数字位数。每次运行都会重新抽取均匀分布随机数,所以数值每次都不一样。由于 Box-Muller 方法每对均匀随机数会产生两个正态随机数,当个数为奇数时,只需丢弃多出来的那一个即可。

公式详解

对于区间 \((0,1]\) 内的均匀随机数 \(U_1\)、\(U_2\): $$X = \exp\!\left(\mu + \sigma\, Z\right), \quad 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 值之上。

将两个均匀随机数转换为对数正态值的 Box-Muller 变换流程图
两个均匀随机数经 Box-Muller 变换成标准正态 \(Z\),再经缩放和指数化得到 \(X\)。

实例演算

取 \(\mu = 1\)、\(\sigma = 2\),并令 \(U_1 = 0.5\)、\(U_2 = 0.25\)。则 \(R = \sqrt{-2\cdot\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() 的随机生成器;在没有固定随机种子的情况下,每次运行都会得到不同的结果。

如果 σ = 0 会怎样?此时分布退化为一个常数,所有数值都等于 \(\exp(\mu)\)。

结果会出现负数吗?不会——对数正态分布的取值范围是 \((0, \infty)\),因此所有输出都严格为正。

最后更新: