【通俗易懂】蓄水池抽样算法-等概率地从n个数中随机抽出m个数
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210110161237625.png#pic_center)
碰到了个题目,题目大概意思如下
题目描述:随机的从大小为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} =(1−m+1mm1)×(1−m+2mm1)×...×(1−nmm1)=m+1mm+2m...nn−1=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} =(1−i+1mm1)×(1−i+2mm1)×...×(1−nmm1)=i+1ii+2i+1...nn−1=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
微信公众号:卓师叔
知乎:学习学习再学习