程式設計珠璣 取樣問題

2021-09-08 14:54:06 字數 877 閱讀 6170

1.問題描述

程式的輸入包含兩個整數m和n,其中m2.解決思路與**實現

程式設計珠璣上給出了四個函式

1).genknuth():演算法依次考慮整數0,1,2,...,n-1,並通過乙個適當的隨機測試對每個整數進行選擇。通過按序訪問整數,可以保證輸出結果是有序的

**c++實現:

void genknuth(int m, int

n) }

}

2).gensets():一種解決方案是在乙個初始為空的集合裡面插入隨機整數,直到個數足夠,這裡利用c++ set容器

void gensets(int m, int

n)

3).genshuffle():生成隨機整數的有序子集的另一種方法是把包含整數0~n-1的陣列的前m個元素打亂,然後把前m個元素排序輸出。

void genshuf(int m, int

n)

sort(x , x+m);

for(i = 0; i < m; i++)

cout

<< x[i] <}

4).genfloyd():m和n接近的時候,基於2)的改進,並能在m個步驟之內就可以按要求等概率地生成有序隨機數

void genfloyd(int m, int

n)

for(i = s.begin(); i != s.end(); ++i)

cout

<< *i <}

程式設計珠璣之取樣問題

要從0 n 1的整數中取出來m m第二種演算法和以前一篇的洗盤演算法比較相似,但是並不是嚴格的每個數字取到的概率為m n,演算法是這樣的,先生成乙個n維的整數陣列,a值為0 n 1,然後生成m個n內的隨機整數rand,然後交換a i 和a rand i 0.m 1 至於是否是滿足m n證明好像有點難...

程式設計珠璣 取樣總結

問題描述 程式的輸入包含兩個整數m和n,其中m小於n。輸出是0 n 1範圍內的m個隨機整數,要求 每個數選擇出現的概率相等,且按序輸出。問題中最重要的要求是概率相同。假設m 2,n 5,那麼每個數都應該以2 5的概率被選中,直觀的會想到用這樣的 實現 if rand 5 2 然而這樣做是不對的,程式...

程式設計珠璣筆記 第12章 取樣問題

整理了這一章提到的幾個演算法,其中蓄水池演算法書中沒有寫,這裡放在一起比較一下,出了方法2是c 的 其它都是python的實現。問題 程式的輸入包括兩個整數m和n,其中m 1 以特定概率順序選擇每乙個數 如果要從r個剩餘的整數中選出s個,則以s r的概率選擇剩餘整數中的第乙個整數,然後遞迴處理剩下的...