題目描述:乙個檔案中含有多個元素,只能遍歷一遍,要求等概率隨機取出其中之一。
先講乙個例子,5個人抽5個籤,只有乙個籤意味著「中籤」,輪流抽籤,那麼這種情況,每個人中籤的概率分別是多大呢?
第乙個人中籤的概率是1/5,
第二個人中籤的情況只能在第乙個人未中時才有可能,所以他中的概率是4/5 * 1/4 = 1/5(4/5表示第乙個人未中,1/4表示在剩下的4個籤裡中籤的概率),所以,第二個人最終的中籤概率也是1/5,
同理,第三個人中籤的概率為:第乙個人未中的概率x 第二個人未中的概率x第三個人中的概率,即為:4/5 * 3/4 * 1/3 = 1/5,
一樣的可以求出第四和第五個人的概率都為1/5,也就是說先後順序不影響公平性。
回到最開始的問題,乙個檔案中包含n個資料,而且n是不可知的,那麼下面的思路就不太可行:隨機選取1-n之間的任意乙個數i = rand(1,n),然後返回檔案中的第i個數。
此題思路如下:
順序遍歷檔案,當前遍歷的元素為第i個元素,picked
表示之前選取了的某乙個元素,此時生成乙個隨機數r=rand(),那麼r%i == 0的概率是
。當r%i== 0的時候,將picked
替換為當前值,否則掃瞄下乙個元素直到檔案結束。
偽**如下:
elementrandompick(file)
int length = 1;
while( length <= file.size )
if( rand() % length == 0)
picked = file[length];
length++;
return picked
上面這種策略,當遍歷完所有的n個數之後,任取一數的概率都是相同的 ,
用歸納法證明:
在遍歷第1個元素的時候,即length為1,那麼rand() % length == 0的概率為1,所以,目前取第1個的概率為1。
遍歷到第2個元素時,length=2,rand() % length == 0的概率為1/2 , 所以目前,取第2個數的概率為1/2 ,取第乙個數的概率為1*(1-(1/2) )=
1/2。
遍歷到第i個元素時,length=i, rand() % length== 0的概率為1/i , rand() % length != 0的概率為(i-1/i) ,所以目前,取第i個數的概率為1/i 。取第m個數(m
走到檔案最後,每乙個元素最終被選出的概率為 1/n 。
(
幾何概率問題 相遇概率
假設小白與小仙晚上7點到8點之間都會前往某地看燈展,約定到的人等另外乙個人15分鐘方可離開,若他們在限時內到達,相遇的概率是多少?解析 這是乙個幾何概率問題。他們能見面的充要條件是時間差不超過15分鐘,即1 4小時。因為兩人沒有確切的時間,故樣本點由兩個數 甲乙兩人各自到達的時刻 組成。以7點鐘作為...
概率取樣問題
問題 程式輸入兩個整數m和n,其中m 顯然,演算法的執行時間為o n 2 基於集合的演算法 在乙個初始為空的集合裡面插入隨機整數,直到個數足夠,核心問題是如何實現集合s。我們可以考慮有序鍊錶 二叉樹等資料結構,但最直接的辦法是利用c 標準模板庫中的set容器。c stl規範要求每次插入操作都在o l...
幾個概率問題
三道門 在乙個 節目上,你面前有三扇門,其中一扇後面有一輛嶄新的法拉利跑車,另外兩扇後面是山羊 如果羊和車出現在每一扇門後的概率是均勻的 就是說每扇門都有1 3的中獎概率 現在你選定了一扇門,但是還未開啟。現在主持人開啟剩下兩扇中的一扇,你看到的是山羊。問題是,現在你改變選擇會有更大的中獎概率嗎?熟...