今天寫乙個10萬個資料的訊息佇列,對裡面的資料輸入和輸出感覺並沒有達到完全隨機的地步,這讓我想起了我之前學習過的蓄水池演算法,然後就自己手擼了乙個感覺比較滿意的隨機池。
蓄水池演算法:
所謂的蓄水池演算法,其實很簡單:先給乙個概念乙個很大的檔案,我要隨機取其中的某一行,先選第一行,然後第二行以1/2的機率決定要不要替換第一行,第三行以1/3的機率要不要替換,直到最後一行,然後每一行的機率都是一樣的。
如果我們要平均選k行呢,就一開始先放k行,然後每次以k/k+1的機率考慮要不要替換池子裡的數,所有操作完成後,就是k/n的概率,具體證明其實也不難,就是乙個逼近的數學式子。
具體應用:
給定乙個單鏈表,隨機選擇鍊錶的乙個節點,並返回相應的節點值。保證每個節點被選的概率一樣。
int * getrandom(listnode* root)
return res;
}
蓄水池演算法
參考文章 問題定義 給你乙個長度為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個數字,讓他們被選擇概率一致。假設n的時候,前n個數字被選擇的概率都是1n 當為n 1時候,當前n 1這個數,我們選擇的概率是1n 1,其餘數字的概率是nn 1,那麼一共有n個數字的概率是1n 所以 n 1n 1 n 1 1n 1 具體演算法 使用的方式是i random.ra...