拒绝采样(reject sampling)Leetcode470

个人理解:通过拒绝样本中某些点出现的概率,来获取想要的样本的频率

leetcode 470 题解

给定方法 rand7 可生成 [1,7] 范围内的均匀随机整数,试写一个方法 rand10 生成 [1,10] 范围内的均匀随机整数。

题解:

微信图片_20210905012406.jpg

由于随机生成的范围10是大于7的,所以生成1次随机数无法生成1到10范围内,选择生成两次随机数,那么一共会有49中可能,

把49种可能均分为10次,且最后结果为整数,则需舍弃9种可能,只保留40种可能,则每个数字出现的概率都是4/49,概率相同,如果是40之外的可能,则重新生成

统计每一次结果对应的数值,%10的结果当作当前的结果

题解:

 public int Rand10() {

        int row,col,idx;

do

        {

            row=Rand7();

            col=Rand7();

            idx=col+(row-1)*7;

//idx的值是列数+(行数-1)*7表示这是第多少种可能

        }

        while(idx>40);

        return 1+(idx-1)%10;

//(idx-1)%10+1,表示以10种可能为一组,当前对应的输出应该是多少 

}

 LeetCode解释:

数值分析和计算统计中,拒绝采样是用于从分布生成观测值的基本技术。它通常也被称为接受拒绝方法或「接受拒绝算法」,是一种精确的模拟方法。该方法适用于具有密度的任何分布。

拒绝采样基于以下观察:在一维中对随机变量进行采样,可以对二维笛卡尔图执行均匀随机采样,并将样本保持在其密度函数图下的区域中.

知乎查找:

蒙特·卡罗方法(Monte Carlo method)也称统计模拟方法,通过重复随机采样模拟对象的概率与统计的问题,在物理、化学、经济学和信息技术领域均具有广泛应用。拒绝采样(reject sampling)就是针对复杂问题的一种随机采样方法。

首先举一个简单的例子介绍Monte Carlo方法的思想。假设要估计圆周率 π 的值,选取一个边长为1的正方形,在正方形内作一个内切圆,那么我们可以计算得出,圆的面积与正方形面积之比为 π/4 。现在在正方形内随机生成大量的点,如图1所示,落在圆形区域内的点标记为红色,在圆形区域之外的点标记为蓝色,那么圆形区域内的点的个数与所有点的个数之比,可以认为近似等于 π/4 。因此,Monte Carlo方法是通过随机采样的方式,以频率估计概率。

Monte Carlo方法估计pi的值

简单分布的采样,如均匀分布、高斯分布、Gamma分布等,在计算机中都已经实现,但是对于复杂问题的采样,就需要采取一些策略, 拒绝采样就是一种基本的采样策略,其采样过程如下:

给定一个概率分布 p(z)=1/(Zp)*p~(z) 其中 p~(z) 已知 Zp 为归一化常数,是未知的。要对该分布进行拒绝采样。首先定义一个参考分布 G ,概率密度函数 g(x) ,该分布可选均匀分布或高斯分布等。另外再定义一个辅助分布 U(0,1) ,为均匀分布。然后引入常数 k 使得对所有的 z 满足 kg(z)≤p~(z) ,然后开始进行采样,在每次采样中先从 g(z) 中采样一个 z0 ,然后在区间 [0,kg(z0)] 里进行均匀采样,得到 u0 。如果 u0<p~(z0) ,则接受,保留该采样值,否则拒绝,舍弃该采样值。最后得到的数据就是对该分布的一个近似采样。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值