【通俗易懂】蓄水池抽样算法-等概率地从n个数中随机抽出m个数

【通俗易懂】蓄水池抽样算法-等概率地从n个数中随机抽出m个数


在这里插入图片描述
碰到了个题目,题目大概意思如下

题目描述:随机的从大小为n的数组中选取m个整数,要求每个元素被选中的概率相等。

网上给出的大部分答案如下:

分析与解答:首先从有N个元素的数组中随机选出一个元素,然后把这个选中的数字与数组中第一个元素交换,接着从数组后面N-1个数字中选出1个元素与数组中第二个元素交换,以此类推,直到选出m个数字为止,数组前m个数字就是随机选出来的m个数字,且他们被选中的概率相同。

说实话看得迷迷糊糊的,最关键的是不知道为什么这么做,尝试通俗易懂的解答这个问题,记录在此。

在这里插入图片描述
其实整个题目可以用上面这个图表示,最后每个值,留在红框内的概率都要是 m n \frac{m}{n} nm ,因此可以换一种计算方式,计算留在红圈内的概率

留在红圈内的概率=进入红圈的概率 * 不被换出红圈的概率

最关键的就在这,我们需要分别分析这两个的概率,而每一个情况中,需要再拆成小于m的情况,和大于m的情况,也就是说有四种情况,最终结果如下:
在这里插入图片描述
等分析完再来看这个表,会一目了然

一、进入红圈的概率

1、当 i < = m i<=m i<=m 时,直接放入红圈,概率为1
2、当 i > m i>m i>m 时,从 [ 1 , i ] [1, i] [1,i] 中抽取随机抽取一个数的位置id,即 d = r a n d o m ( 1 , i ) d = random(1, i) d=random(1,i) ,然后把下标为d的值换走,把下标为i的值换进去,此时换进去的概率是 m i \frac{m}{i} im

二、不被换出红圈的概率

1、当 i < = m i<=m i<=m

这种情况是从 m + 1 m+1 m+1 项才开始可以把 i i i 换出去;我们以 m + 1 m+1 m+1 的时候为例,从上文的情况可以知道, m + 1 m+1 m+1 被换的概率是 m m + 1 \frac{m}{m+1} m+1m ,而他在第 i 次被换出的概率是 1 m \frac{1}{m} m1 m + 2 m+2 m+2 的情况可以以此类推。最后得:

= ( 1 − m m + 1 1 m ) × ( 1 − m m + 2 1 m ) × . . . × ( 1 − m n 1 m ) = m m + 1 m m + 2 . . . n − 1 n = m n =(1-\frac{m}{m+1}\frac{1}{m})\times(1-\frac{m}{m+2}\frac{1}{m})\times ...\times(1-\frac{m}{n}\frac{1}{m})\\=\frac{m}{m+1}\frac{m}{m+2}...\frac{n-1}{n}\\ =\frac{m}{n} =(1m+1mm1)×(1m+2mm1)×...×(1nmm1)=m+1mm+2m...nn1=nm

至此,我们是可以知道在 i < = m i<=m i<=m 时,被放入红圈的概率是:
1 × m n = m n 1\times\frac{m}{n}=\frac{m}{n} 1×nm=nm

2、当 i>m 时

i i i 被换入的概率已知是 m i \frac{m}{i} im ,假设 i i i 被换入红圈了,从 i + 1 i+1 i+1 项开始就有可能再把第 i 项换出来了,即

= ( 1 − m i + 1 1 m ) × ( 1 − m i + 2 1 m ) × . . . × ( 1 − m n 1 m ) = i i + 1 i + 1 i + 2 . . . n − 1 n = i n =(1-\frac{m}{i+1}\frac{1}{m})\times(1-\frac{m}{i+2}\frac{1}{m})\times ...\times(1-\frac{m}{n}\frac{1}{m})\\=\frac{i}{i+1}\frac{i+1}{i+2}...\frac{n-1}{n}\\ =\frac{i}{n} =(1i+1mm1)×(1i+2mm1)×...×(1nmm1)=i+1ii+2i+1...nn1=ni

至此,我们是可以知道在 i > m i>m i>m 时,被放入红圈的概率是:

m i × i n = m n \frac{m}{i}\times\frac{i}{n}=\frac{m}{n} im×ni=nm

最后再看上面那个表格,是不是就十分清楚!!!

「卓师叔」

作者:卓师叔,爱书爱金融的NLPer

微信公众号:卓师叔

知乎:学习学习再学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值