两种随机数生成方法——反函数法和舍选法
我们知道,对于均匀分布的随机数,我们可以使用随机数生成器类似的方法生成均匀分布的随机数。包括线性同余发生器,FSR发生器等。对于非均匀分布的随机数,对于连续型随机变量,如果我们知道该分布的密度函数,则可以使用反函数法和舍选法生成随机数。
反函数法生成随机数
反函数法生成随机数的原理如下:
具体步骤如下:
1.使用随机数发生器等方法生成均匀分布随机数
2.求解Fx的反函数
3.带入生成的均匀分布随机数,则生成分布函数为Fx的随机数
例:生成柯西分布随机数
柯西分布分布函数是
F
(
x
)
=
1
2
+
1
π
a
r
c
t
a
n
(
x
)
F(x) = \frac{1}{2}+\frac{1}{{\pi}}arctan(x)
F(x)=21+π1arctan(x)
n = 1e5
x = runif(n)
res = tan(pi*(x-1/2))
反函数法缺点:一些函数的反函数表示不出来,此时反函数法就无法使用。
舍选法生成随机数
舍选法的原理:
解释:使用一个简单区域包含目标区区域,然后在这个简单区域上使用均匀分布生成随机数,再对随机数进行判断,是否落在目标区域内。
例子:使用舍选法生成正态分布随机数
目标密度:
p
(
x
)
=
(
2
π
)
−
1
/
2
e
x
p
(
−
x
2
2
)
p(x) = (2{\pi})^{-1/2}exp(-\frac{x^2}{2})
p(x)=(2π)−1/2exp(−2x2)
试投密度:
f
(
x
)
=
1
π
(
1
+
x
2
)
f(x) = \frac{1}{{\pi(1+x^2)}}
f(x)=π(1+x2)1
#3
c = 2
z = rep(NA,1e3);
i = 1
while(i<=1e3){
x_old = runif(1)
x_new = tan(pi*(x_old-1/2))
u = runif(1)
p = ((2*pi)^(-1/2))*exp(-(x_new^2)/2)
g = 1/2+(1/pi)*atan(x_new)
if(u<=p/(c*g)){
z[i] = x_new;
i = i+1
}
}
z
hist(z,prob = T,ylim=c(0,1))
其中,c的最优值是
更多推荐
两种随机数生成方法——反函数法和舍选法
发布评论