**更詳細的大神部落格
問題1:在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行,並且每行被抽中的概率相等?
問題2:在不知道檔案總行數的情況下,如何從檔案中隨機的抽取 k 行,並且每行被抽中的概率相等?
問題一:抽取一行
在知道檔案行數的情況下,直接用 rand 函式就可以
不知道檔案行數的時候,我們需要乙個概念來使得對每一行取出的概率相等,也即隨機。這個概念即蓄水池抽樣
解決方案:
直接選取第一行作為我們的最後選擇:choice1/2 的概率,將choice換成第二行
1/3 的概率,將choice換成第三行
。。。1/i 的概率,將choice換成第 i 行
。。。1/n 的概率,將choice換成第 n 行
為什麼這樣可以呢,是有數學方面嚴格證明的
證明如下:
其實知道每行被選取的概率的公式之後,自己就可以推導問題二:抽取 k 行(問題一的擴充套件)
當理解了問題一,其實問題二就很好理解,可以將 k 行資料看做乙個整體
解題思路:
讀取第 i 行,以 k/i 概率決定是否要把它換入蓄水池,
如果要換入,換入時隨機的選取乙個作為替換項(這時候池子裡面有 k 項,可以使用 rand 函式)
這樣的話,對於任意的 n ,都能保證每個數的選取概率都為 k/n,每個數選取概率相等,即隨機。
證明如下:
重點在於每行被選取的概率的公式,理解之後,稍微化簡一下就可以推導出來。海量資料等概率隨機選取問題
1 問題定義可以簡化如下 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行?首先想到的是我們做過類似的題目嗎?當然,在知道檔案行數的情況下,我們可以很容易的用c執行庫的rand 函式隨機的獲得乙個行數,從而隨機的取出一行,但是,當前的情況是不知道行數,這樣如何求呢?我們需要乙個概念來幫助我們做...
MySQL隨機選取資料
本文實現了mysql的隨機數 mysq隨機選取資料 mysq隨機查詢資料 mysq隨機更新資料。mysq隨機查詢資料 以前在群裡討論過這個問題,比較的有意思.mysql的語法真好玩.他們原來都想用php的實現隨機,但取出多條好像要進行兩次以上查詢.翻了手冊,找到了下面這個語句,可以完成任務了。sel...
海量資料等概率選取問題
1 問題定義可以簡化如下 在不知道檔案總行數的情況下,如何從檔案中隨機的抽取一行,並且每行被抽中的概率相等?首先想到的是我們做過類似的題目嗎?當然,在知道檔案行數的情況下,我們可以很容易的用c執行庫的rand 函式隨機的獲得乙個行數,從而隨機的取出一行,但是,當前的情況是不知道行數,這樣如何求呢?我...