從輸入流中隨機抽取m個元素

2021-06-09 01:50:58 字數 518 閱讀 5629

有乙個很大很大的輸入流,大到沒有儲存器可以將其儲存下來,

而且只輸入一次,如何從這個輸入流中隨機取得m個記錄。

思路:我們可以用fisher-yates隨機排列演算法解決該問題。用大小為m的陣列arr[0:m-1]來儲存隨機抽取的元素,arr[0:m-1]逐步初始化為輸入流的前m個元素的乙個隨機排列。

對於輸入流中的第k (k>m)個元素,隨機生成乙個[0,k-1]區間內的整數i,如果此隨機整數i小於等於m,那麼就用第k個元素覆蓋掉arr[i-1],否則,丟棄第k個元素。

注意,每從輸入流中提取乙個新元素,我們都要隨機生成乙個整數,而此整數的有可能出現的範圍都要加1. 

給出的演算法是錯誤的,這個演算法有兩個問題:

為什麼 給出的演算法不能生成乙個等概率的抽取呢?原因很簡單:由於陣列arr被初始化為輸入流的前m個元素,前m個元素是以100%的概率被插入到陣列arr中的。但是,對於輸入流中往後的元素,如果從[0,n-1]中隨機生成它們的位置,顯然它們只能以m/n的概率被插入到陣列arr中,用這種方式生成的隨機抽取顯然就不是等概率的了。

最全隨機抽樣演算法 從N個數中抽取M個等 集合

1.從n個數中等概率抽取m個數 從n個樣本中等概率抽取m個樣本 mpublic static setsampletest set.add second while set.contains third set.add third return set public static void sampl...

php從陣列中隨機抽取一些元素

class getvalues 該函式此處沒用到 public function inputvalue inputarray public function getvalue number asort getarray 從小到大排序,根據需要修改 return getarray 測試 keyword...

shell 隨機從檔案中抽取若干行

shuf n5 main.txt sort r main.txt head 5 awk vn 5 vc wc l file begin shuf 命令的選項 e,echo 將每個引數視為輸入行 i,input range lo hi 將lo 到hi 的每個數字視為輸入行 n,head count 行...