两种随机数生成方法——反函数法和舍选法

我们知道,对于均匀分布的随机数,我们可以使用随机数生成器类似的方法生成均匀分布的随机数。包括线性同余发生器,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的最优值是

更多推荐

两种随机数生成方法——反函数法和舍选法