【通俗易懂】蓄水池抽样算法-等概率地从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

微信公众号:卓师叔

posted on 2022-03-30 11:47  ZhYQ_note  阅读(179)  评论(0)    收藏  举报

导航