python3 锦鲤第一步!了解随机抽样之蓄水池算法

python3 锦鲤第一步!了解随机抽样之蓄水池算法

  1. 蓄水池算法
    问题背景:
    样本空间为N,从N个样本中随机不重复地抽取K个样本,其中N是未知且非常巨大的数,如何保证每个样本是等概率被抽取才是关键。

    算法逻辑:
    (1)先选取前k个数据(0,1,2,…k-1,角标从0开始)
    (2)对于第i个数据(k<=i<n),随机生成区间[0, i)的一个数r,如果r<k,则将数据替换。

    近期的朋友圈都在疯转各式各样的锦鲤,早晨起来看见了一篇关于随机抽样的推文,就想了解一下这个蓄水池算法。在此现实背景下,默认一个活动的锦鲤只有一条,那么K=1。
    接下来证明算法逻辑下每个样本成为锦鲤的概率均为1/N:
    在这里插入图片描述

  2. 代码实现
    使用的是python3编译:

import numpy
import os
import random

def SelectJINLI(List1):
 List1[0] = []    #锦鲤的奖池,将会容纳列表List1的某个用户名
 a = []   
 num=2       #List1[1]是num=1的时候,num=2即刚好是是List[1]
 for i in List1[1:]:
     if random.random() < 1.0/num:    #random.randdom()随机产生的是[0,1)的数值
         a = List1[num-1]         #满足条件,即将List1[num-1]放入奖池中
         List1[0] = a
     num=+1
     

Notes:
程序中的List1可以是爬取的微博转发列表,也可以是其它姓名列表。
废话一句,多次转发,列表里有多个相同ID,可以通过去除重复ID,保证每人成为锦鲤的概率相等。所以私以为,转发多次不能增加获奖概率。
如今众多平台相继发送锦鲤文案,在佩服某巨头公司的集卡、返利、锦鲤推广的同时,多个相关小平台的转发,缺乏监管单位监督下,感觉更像是一次娱乐泡沫。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值