# coding:utf8
import random
# 从n个数中采样k个数
def reservoir_sampling(n, k):
# 所有数据
pool = [i for i in range(n)]
# 前k个数据
res = [i for i in range(k)]
for i in range(k, n):
v = random.randint(0, i)
if v < k:
res[v] = i
return res
先选中第1到k个元素,作为被选中的元素。然后依次对第k+1至第N个元素做如下操作:
x是元素的序号,每个元素都有k/x的概率被选中,然后等概率的(1/k)替换掉被选中的元素。