#问题

    要求从N个元素中随机的抽取k个元素,其中N无法确定。

伪代码

    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

#证明 初始情况: i<=k,i个元素全部放入水库,每个元素出现在水池的概率为1。

假设k<=j<=i时结论成立。

当j=i+1,第i+1个元素会以k/(i+1)的概率被选中, 前i个元素在本次替换操作完成时出现在水池的概率分解为:

    1) 在i+1选择前出现在水池中,这个概率是k/i
    2) 并且在i+1次没有被替换掉,这个概率=1-这个元素被替换掉的概率=1-k/(i+1)*(1/k)=i/(i+1)

所以前i个元素出现在水池的概率为(k/i)*(i/(i+1))=k/(i+1)

由归纳法可知结论成立。