蓄水池算法

在一个未知的池子里选1个数字,让他们被选择概率一致。
假设n的时候,前n个数字被选择的概率都是 1n
当为n+1时候,当前n+1这个数,我们选择的概率是 1n+1 ,其余数字的概率是 nn+1 ,那么一共有n个数字的概率是 1n
所以

n1n1n+1=1n+1

具体算法代码使用的方式是i = random.randint(0,n) < k则选择。
这里其实就是在[0,n]区间内选择了是否比k大的数字。

import random
def demo(lst,k):
    ret_lst = lst[0:k]
    for i in range(k,len(lst)):
        m = random.randint(0,i)
        if m < k:
            ret_lst[m] = lst[i]
    return ret_lst


def main():
    iters = 10000
    num = 10
    cnt_lst = [0 for i in range(num)]
    for i in range(iters):
        lst = [i for i in range(num)]
        ret_lst = demo(lst,3)
        for x in ret_lst:
            cnt_lst[x] += 1 
    pro_lst = list(map(lambda x :x/iters,cnt_lst))
    print(cnt_lst)
    print(pro_lst)
if __name__ == '__main__':
    main()
[3083, 2982, 3048, 2966, 3032, 2930, 2907, 3094, 2958, 3000]
[0.3083, 0.2982, 0.3048, 0.2966, 0.3032, 0.293, 0.2907, 0.3094, 0.2958, 0.3]

这里写链接内容
这里写链接内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值