[python]蓄水池抽样算法的实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2019/8/8 0008 19:52
# @Author  : joker-syc
# @Site    : 
# @File    : 蓄水池抽样算法.py
# @Software: PyCharm

'''
问题:如何随机从n个对象中选择一个对象,这n个对象是按序排列的,但是在此之前你是不知道n的值的。
'''

'''
解法:我们总是选择第一个对象,以1/2的概率选择第二个,以1/3的概率选择第三个,
以此类推,以1/m的概率选择第m个对象。当该过程结束时,每一个对象具有相同的选中概率
'''
#按照题目要求,我打算将需要抽样的数据假设为一个不知道其长度的列表(在抽样函数运行的过程中,不去查询列表的长度)
#先假定一个长列表作为测试数据
import random
a=[1,2,32,3,4,4,4,43,43,43,3,23,3,4,4,55,5,6,6,6,6,54,3,4,3,43,4,34,32,3,1,3,4,34,3,4,1,1,3]

def sampling(sample):
    c=0
    for b in sample:
        # 先给抽取到的值choice赋初值
        if c==0:
            choice=b
        #之后,每遇到一个新的值,就要进行判定
        z=random.randint(0,c+1)
        #这里实际上就是用random产生的随机数来判断    我发现产生随机数时是概率均等的,
        # 而题意要求的是"第二个是1/2的概率 第三个是1/3的概率..."所以就想到了用这个来模拟(应该是对的吧)
        if z!=(c+1):
            c+=1
            pass
        else:
            choice=sample[c+1]
            c+=1
        # print(choice)

    return choice

if __name__ == '__main__':
    for e in range(10):
        print('\n',str(sampling(a)))




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值