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:
    python3 锦鲤第一步!了解随机抽样之蓄水池算法

  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,保证每人成为锦鲤的概率相等。所以私以为,转发多次不能增加获奖概率。
如今众多平台相继发送锦鲤文案,在佩服某巨头公司的集卡、返利、锦鲤推广的同时,多个相关小平台的转发,缺乏监管单位监督下,感觉更像是一次娱乐泡沫。