在不知道数据规模的情况下进行采样,就要用到蓄水池采样算法。
算法过程
假设数据总规模为N,需要采样k个数。那么先构建一个k大小的数组result,将数据的前k个数放进去。然后从第k+1个数开始,产生一个随机数r,如果这个r < k,则将当前遍历到的数替换result[r]。
这个算法保证了数组中的元素被替换的概率是相同的,都为 k/n。证明如下:(图源https://www.cnblogs.com/snowInPluto/p/5996269.html)
code
1 | import java.util.*; |