1. 程式人生 > >python3 成為錦鯉的第一步!瞭解隨機抽樣之蓄水池演算法

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,保證每人成為錦鯉的概率相等。所以私以為,轉發多次不能增加獲獎概率。 如今眾多平臺相繼傳送錦鯉文案,在佩服某巨頭公司的集卡、返利、錦鯉推廣的同時,多個相關小平臺的轉發,缺乏監管單位監督下,感覺更像是一次娛樂泡沫。