蓄水池演算法

2021-08-13 08:28:08 字數 1104 閱讀 9069

在乙個未知的池子裡選1個數字,讓他們被選擇概率一致。

假設n的時候,前n個數字被選擇的概率都是1n

當為n+1時候,當前n+1這個數,我們選擇的概率是1n

+1,其餘數字的概率是nn

+1,那麼一共有n個數字的概率是1n

所以 n∗

1n∗1

n+1=

1n+1

具體演算法**使用的方式是i = random.randint(0,n) < k則選擇。

這裡其實就是在[0,n]區間內選擇了是否比k大的數字。

import random

defdemo

(lst,k):

ret_lst = lst[0:k]

for i in range(k,len(lst)):

m = random.randint(0,i)

if m < k:

ret_lst[m] = lst[i]

return ret_lst

defmain

(): iters = 10000

num = 10

cnt_lst = [0

for i in range(num)]

for i in range(iters):

lst = [i for i in range(num)]

ret_lst = demo(lst,3)

for x in ret_lst:

cnt_lst[x] += 1

pro_lst = list(map(lambda x :x/iters,cnt_lst))

print(cnt_lst)

print(pro_lst)

if __name__ == '__main__':

main()

[3083, 2982, 3048, 2966, 3032, 2930, 2907, 3094, 2958, 3000]

[0.3083, 0.2982, 0.3048, 0.2966, 0.3032, 0.293, 0.2907, 0.3094, 0.2958, 0.3]

這裡寫鏈結內容

這裡寫鏈結內容

蓄水池演算法

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

蓄水池演算法

適用情況 從n個數中等概率隨機取出k個數,n很大,k也很大 n不固定增量型 內容 當i屬於1 k i入池 當i k i以概率k i決定是否進入池,1 k概率剔除池中乙個數 證明 1 當i 當k個數時,i留下概率 1 當k 1個數時,i被淘汰的概率 1 k k k 1 1 k 1 i留下概率 1 1 ...

蓄水池演算法

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