python 蓄水池抽樣演算法的實現

2021-09-26 00:02:50 字數 1360 閱讀 5630

#!/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 randoma=[

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]defsampling

(sample)

: c=

0for 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+=1pass

else

: choice=sample[c+1]

c+=1# print(choice)

return choice

if __name__ ==

'__main__'

:for e in

range(10

):print

('\n'

,str

(sampling(a)

))

演算法 蓄水池抽樣

例題 有乙個機器按自然數序列的方式吐出球,1號球,2號球.現有乙個袋子,袋子裡最多只能裝下k個球,並且除袋子以外沒有更多的空間,球扔掉不能放回。設計一種選擇方式,使得當機器吐出第n號球時,袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個被選中進袋子的概率都是k n。具體例子 有乙個只能裝下...

蓄水池抽樣演算法

給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 蓄水池抽樣演算法 該演算法是針對從乙個序列中隨機抽取不重複的k個數,保證每個數被抽取到的概率為k n這個問題...

蓄水池抽樣演算法

題目 要求從n個元素中隨機的抽取k個元素,其中n無法確定 解法 首先選擇n中的前k個數加入 蓄水池 中,然後從第k 1個數開始,以k k i i 1,2,3.的概率選擇這個數,然後在蓄水池中隨機選擇乙個數,並將其替換,n個元素遍歷完畢後,蓄水池中的k個數就是隨機選擇的。證明 這裡即需要證明每個數出現...