在n不確定的情況下生成k個隨機數

2021-06-26 06:06:45 字數 1267 閱讀 8395

在n不明確的情況下,隨機取k個元素。

**:隨即抽樣問題:

要求從n個元素中隨機的抽取k個元素,其中n無法確定。

是在 《計算機程式設計與藝術》 中看到的這個題目,書中只給出了解法,沒給出證明。

解決方法是叫reservoir sampling (蓄水池抽樣)

init : a reservoir with the size: k

for   i= k+1 to n

m=random(1, i);

if( m < k)

swap the mth valueand ith value

end for

證明:每次都是以 k/i 的概率來選擇 

例: k=1000的話, 從1001開始作選擇,1001被選中的概率是1000/1001,1002被選中的概率是1000/1002,與我們直覺是相符的。 

接下來證明: 

假設當前是i+1, 按照我們的規定,i+1這個元素被選中的概率是k/i+1,也即第 i+1 這個元素在蓄水池中出現的概率是k/i+1 

此時考慮前i個元素,如果前i個元素出現在蓄水池中的概率都是k/i+1的話,說明我們的演算法是沒有問題的。 

對這個問題可以用歸納法來證明:k < i <=n 

1.當i=k+1的時候,蓄水池的容量為k,第k+1個元素被選擇的概率明顯為k/(k+1), 此時前k個元素出現在蓄水池的概率為 k/(k+1), 很明顯結論成立。

2.假設當 j=i 的時候結論成立,此時以 k/i 的概率來選擇第i個元素,前i-1個元素出現在蓄水池的概率都為k/i。  

證明當j=i+1的情況: 

即需要證明當以 k/i+1 的概率來選擇第i+1個元素的時候,此時任一前i個元素出現在蓄水池的概率都為k/(i+1). 

前i個元素出現在蓄水池的概率有2部分組成, ①在第i+1次選擇前得出現在蓄水池中,②得保證第i+1次選擇的時候不被替換掉 

①.由2知道在第i+1次選擇前,任一前i個元素出現在蓄水池的概率都為k/i 

②.考慮被替換的概率:   

首先要被替換得第 i+1 個元素被選中(不然不用替換了)概率為 k/i+1,其次是因為隨機替換的池子中k個元素中任意乙個,所以不幸被替換的概率是 1/k,故 

前i個元素中任一被替換的概率 = k/(i+1) * 1/k = 1/i+1 

則沒有被替換的概率為:   1 - 1/(i+1) = i/i+1 

綜合① ②,通過乘法規則 

得到前i個元素出現在蓄水池的概率為 k/i * i/(i+1) = k/i+1 

故證明成立

生成k個不同的隨機數(1 n)

程式設計珠璣 習題1.4 如果認真考慮了習題3,你將會面對生成小於n且沒有重複的k個整數的問題。最簡單的方法就是使用前k個正整數。這個極端的資料集合將不會明顯的改變位圖方法的執行時間,但是可能會歪曲系統排序的執行時間。如何生成位於0至n 1之間的k個不同的隨機順序的隨機整數?盡量使你的程式簡短高效。...

在經濟條件允許的情況下 做乙個新時代的雷鋒

1.遇到乞討者 遇到要錢的就給他 她 點飯,遇到要飯的就給他 她 點錢。2.上車遇到老弱病殘 孕婦 讓座的時候別動聲色,也別大張旗鼓。站起來用身體擋住其他人留出空位子給需要的人,然後裝作下車走遠點。人太多實在走不遠,人家向你表示謝意的時候微笑一下。3.雨雪的時候 天冷的傍晚或者是雪天的傍晚,遇到賣菜...

單鏈表在不知頭結點的情況下對第i個元素的刪除

一 首先,看看單鏈表中第i個元素的刪除 status listdelete l linklist l,int i,elemtype e if p next j刪除位置不合理 q p next p next q next 刪除並釋放結點 e q data free q return ok 例如對單鏈表...