【通俗易懂】蓄水池抽样算法-等概率地从n个数中随机抽出m个数
原文地址:https://zhuanlan.zhihu.com/p/342554800
碰到了个题目,题目大概意思如下
题目描述:随机的从大小为n的数组中选取m个整数,要求每个元素被选中的概率相等。
网上给出的大部分答案如下:
分析与解答:首先从有N个元素的数组中随机选出一个元素,然后把这个选中的数字与数组中第一个元素交换,接着从数组后面N-1个数字中选出1个元素与数组中第二个元素交换,以此类推,直到选出m个数字为止,数组前m个数字就是随机选出来的m个数字,且他们被选中的概率相同。
说实话看得迷迷糊糊的,最关键的是不知道为什么这么做,尝试通俗易懂的解答这个问题,记录在此。

其实整个题目可以用上面这个图表示,最后每个值,留在红框内的概率都要是 ,因此可以换一种计算方式,计算留在红圈内的概率
留在红圈内的概率=进入红圈的概率 * 不被换出红圈的概率
最关键的就在这,我们需要分别分析这两个的概率,而每一个情况中,需要再拆成小于m的情况,和大于m的情况,也就是说有四种情况,最终结果如下:
| 进入红圈的概率 | 不被换出红圈的概率 | 总概率(相乘) | |
|---|---|---|---|
| i<=m | 1 | m/n | m/n |
| m<i<=n | m/i | m/n | m/n |
等分析完再来看这个表,会一目了然
一、进入红圈的概率
1、当 时,直接放入红圈,概率为1
2、当 时,从
中抽取随机抽取一个数的位置id,即
,然后把下标为d的值换走,把下标为i的值换进去,此时换进去的概率是
;
二、不被换出红圈的概率
1、当 时
这种情况是从 项才开始可以把
换出去;我们以
的时候为例,从上文的情况可以知道,
被换的概率是
,而他在第
次被换出的概率是
。
的情况可以以此类推。最后得:
至此,我们是可以知道在 时,被放入红圈的概率是:
2、当 时
被换入的概率已知是
,假设
被换入红圈了,从
项开始就有可能再把第
项换出来了,即
至此,我们是可以知道在 时,被放入红圈的概率是:
最后再看上面那个表格,是不是就十分清楚!!!
作者:卓师叔,爱书爱金融的NLPer
微信公众号:卓师叔
浙公网安备 33010602011771号