#!/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個數就是隨機選擇的。證明 這裡即需要證明每個數出現...