海量資料隨機選取

2021-10-23 18:23:56 字數 1122 閱讀 6585

**更詳細的大神部落格

問題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 函式隨機的獲得乙個行數,從而隨機的取出一行,但是,當前的情況是不知道行數,這樣如何求呢?我...