求生成服从指定密度函数随机变量的第二种算法(已掌握一种)
嘿,先帮你澄清一个关键误区:你当前尝试的步骤并不能生成服从目标密度的随机变量。直接把Unif(0,1)的随机数代入$f(x)$,得到的只是密度函数在该点的取值,和符合目标分布的样本完全是两回事。下面给你两种实用的正确生成方法:
方法一:逆变换采样法
逆变换是生成随机变量的经典方法,核心思路是先求出累积分布函数(CDF),再对其求逆,最后用均匀随机数代入逆函数得到样本。
计算目标分布的CDF
对密度函数$f(t)$从0到x积分,得到累积分布函数$F(x)$:
$$
F(x) = \int_{0}^{x} \left( \frac{1}{4} + 2t^3 + \frac{5}{4}t^4 \right) dt
$$
计算后得到:
$$
F(x) = \frac{1}{4}x + \frac{1}{2}x^4 + \frac{1}{4}x^5 \quad (0<x<1)
$$
验证一下:当$x=1$时,$F(1)=\frac{1}{4}+\frac{1}{2}+\frac{1}{4}=1$,完全符合CDF的性质。生成样本的具体步骤
- 生成一个$\text{Unif}(0,1)$的随机数$U$
- 解方程$\frac{1}{4}X + \frac{1}{2}X^4 + \frac{1}{4}X^5 = U$,得到的$X$就是符合目标密度的随机变量。
- 由于这个方程没有解析解,你需要用数值方法(比如牛顿-拉夫逊迭代)来求解$X$,只要迭代初始值选在(0,1)区间内,收敛速度会很快。
方法二:接受-拒绝采样法
如果逆变换的数值求解对你来说有点麻烦,接受-拒绝法是个不错的替代方案,它用一个容易采样的“提议分布”来覆盖目标分布,通过筛选得到有效样本。
选择提议分布并确定常数$M$
我们选最简单的$\text{Unif}(0,1)$作为提议分布,它的密度$g(x)=1$($0<x<1$)。接下来要找一个常数$M$,使得$f(x) \leq M \cdot g(x)$对所有$0<x<1$成立。先求$f(x)$在(0,1)的最大值:对$f(x)$求导得$f'(x)=6x² + 5x³$,在(0,1)区间内导数始终为正,说明$f(x)$是单调递增的,所以在$x=1$处取最大值:
$$
f(1)=\frac{1}{4}+2+\frac{5}{4}=4
$$
所以取$M=4$,此时$f(x) \leq 4 \times 1$对所有$0<x<1$都成立。生成样本的具体步骤
- 生成第一个均匀随机数$X \sim \text{Unif}(0,1)$
- 生成第二个均匀随机数$Y \sim \text{Unif}(0,1)$
- 判断:如果$Y \leq \frac{f(X)}{M} = \frac{1}{4}f(X)$,就接受$X$作为目标样本;如果不满足,就拒绝$X$,重复上述步骤直到得到一个被接受的样本。
小补充
- 逆变换采样的优势是每个均匀随机数最终都能得到一个有效样本(只要数值解方程收敛),而接受-拒绝法会有一定的拒绝率,这里的拒绝率是$1-\frac{1}{4}=75%$,也就是平均每4次尝试能得到1个有效样本。
- 如果想降低拒绝率,也可以选择更贴近目标分布的提议分布(比如某个Beta分布),不过计算$M$的过程会稍微复杂一点。
内容的提问来源于stack exchange,提问作者Guest

