前言 蓄水池抽样原理
问题抽象为:从n个数中随机采样k个,每个数被采样的概率是k/n。
思路一:
将n个数按顺序编号1,2,3,...,k,k+1,k+2,...k+n-k
选前k个数放到蓄水池里,
对于i = 1...n-k
按k/(k+i)的概率采样第k+i个数,然后随机跟蓄水池里的一个数替换。
思路二:
主要思想就是保持一个集合(这个集合中的每个数字出现),作为蓄水池,依次遍历所有数据的时候以一定概率替换这个蓄水池中的数字。
其伪代码如下:
Init : a reservoir with the size: k
for i= k+1 to N
M=random(1, i);
if( M <= k)
SWAP the Mth value and ith value
end for
解释一下:程序的开始就是把前k个元素都放到水库中,然后对之后的第i个元素,以k/i的概率替换掉这个水库中的某一个元素,所以每个元素被替换的概率是1/i
————————————————
原文链接:https://blog.csdn.net/sharelearner/article/details/10917075