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

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

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

  • 8
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值