蓄水池算法
【问题描述】有i个球,k个桶,实现一个算法,使得每个球进桶的概率相等。如果i个数增加,概率也还是相等。相当于前面的球的入桶概率随着总的球数动态变化。假设i慢慢增加,加到N为止。
【解答】
总球数变化,前面的球的入桶概率也要动态变化,这时候要使得桶中的球有一定概率出桶被淘汰。
具体算法进行如下步骤:
一、i<=k时,前k个球全部入桶。
二、i>k后,第i个球以k/i的概率入桶,随机从k个桶中选一个出桶,放入第i个球。
【证明】
一、对于i<=k的球
运算到第k+1个球时,前k个球有k/k+1 * 1/k = 1/k+1的概率出桶,所以留下来的概率时k/k+1
运算到第k+2个球时,k/k+2 * 1/k = 1/k+2出桶 入桶概率k+1/k+2
累乘k/N
二、对于i>k的球
对于第k+1的球,入桶概率k/k+1,之后有可能被淘汰出桶概率为k/k+2 * 1/k = 1/k+2,留桶的概率为k+1/k+2,到k+2的球时留桶概率时k/k+2,最后的留桶概率是k/N
对于k+2的球,同理