问题:
如何从N个元素中等概率抽取K个元素(N > K)
方法:
首先构建一个可放k个元素的蓄水池,将序列的前k个元素放入蓄水池中,然后从第k+1个元素开始,以k/i (k<i<=n)的概率来决定该元素是否被替换到池子中,并且从池子中等概率淘汰一个球。
-
对于第i个数(i<k),在前k步被选中的概率是1, 从第k+1步开始,i不被选中的概率为k/k+1,那么读到第n个数时, 第i个数(i<k)被选中的概率 = 被选中的概率 * 以后每一步都不被换走的概率,即
1 * k/k+1 * k+1/k+2 …n-1/n = k/n -
对于第j个数(j>=k)被选中的概率为: 在他出现时被选中的概率 * 在他出现以后不被换走的概率,即:
k/j * j /j+1 。。。n-1/n = k/n -
综上得证。
应用:
玩家登陆的那一刻即可知道是否中奖,不用等到收集完所有上线玩家,且只需维护一个中奖池而不是一个玩家池。