蓄水池问题
问题背景:如何在N个数据中 等概率地取出k个。如果N会随着时间增长呢?
我们先来考虑简单的,就是如何在数据总数会增长的情况下等概率取出其中一个。
设想一段流水线不断流来产品,要求随机取出一个。第一个,很简单,直接取得即可
概率为1/1。如果第二个到来,那么我们在0.5和1直接取得一个随机数,如果大于0.5那么用第二个替换掉第一个,否则不替换。这样前两个每个被选中的概率都是1/2。
第三个来了,我们以1/3的概率选中第三个,如果选中了,则用它替换掉前面已经选中的
这样前三个每个被选中的概率都是1/3。简单证明:很显然3被选中概率是1/3, 对于2,在前两轮中被选中概率是1/2,第三轮中不被替换的概率
(即3不被选中的概率)是2/3,所以p(选中2) = 1/2 * 2/3 = 1/3, 同理1被选中的概率也是1/3。
推广:对于总数为N的流水线等概率选择一个,令i = 2开始,以p = 1/i的概率选中当前数,来替换掉已经选中的
数,这样可保证前i个数每个被选中的概率都等于1/i。
数学归纳法:
i=2,成立。
假设i=j成立,则只需证明i=j+1也成立即可。
i = j+1 时,取random(1,j+1),在i到j+1之间取一个随机数,如果等于1,那么用第j+1个数替换掉选中的数。
由于p(随机数=1