这个生成器能做什么
本工具会生成一组服从对数正态分布的伪随机数。当一个随机变量 \(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 值之上。
实例演算
取 \(\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)\),因此所有输出都严格为正。