方法不是我原创的,只是学习了别人的方法,用自己的语言总结一下。
问题描述:
超大数据,随机等概率抽取m个样本,如何进行?
问题分析:
问题在于一开始并不知道数据规模,如果知道数据的数量n,自然可以以m/n的概率对每一个逐条读入的数据选择是否抽取。
解决方案:
逐条读入数据,
1. 1~m条数据,均存入待定数组(数组定长m)
2. 读到于第k条数据时
- 第k条数据选中的概率为: m/k
- 对于原来待定数组中的数据,随机选择一条,替换为新数据(第k条数据)
证明:
1. 前m条数据
被第K条数据替换的概率为: 1/m * m/k = 1/k = k-1/k, k = m+1, m+2, ... , n
所以最终被选中的概率为:
(m / m + 1) * (m + 1/m+2)* .... * (n - 1 / n) = m /k
2. m + 1, m+2, ...n这些后续数据(和上面差不多,偷懒不写了)