python3 成為錦鯉的第一步!瞭解隨機抽樣之蓄水池演算法
阿新 • • 發佈:2018-12-15
python3 錦鯉第一步!瞭解隨機抽樣之蓄水池演算法
-
蓄水池演算法 問題背景: 樣本空間為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編譯:
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,保證每人成為錦鯉的概率相等。所以私以為,轉發多次不能增加獲獎概率。 如今眾多平臺相繼傳送錦鯉文案,在佩服某巨頭公司的集卡、返利、錦鯉推廣的同時,多個相關小平臺的轉發,缺乏監管單位監督下,感覺更像是一次娛樂泡沫。