**:
一、簡單的隨機抽樣:乙個總體的個數為n,如果通過逐個抽取的方法從中抽取
乙個樣本,且每次抽取時各個個體被抽到的概率相等,則這樣的抽樣為簡單的隨機抽樣。
例如,從含有6個個體的總體中抽取乙個容量為2的樣本,則在抽樣過程
中某個個體a被抽到的概率是多少?
2/6(1) 第一次a被抽中 1/6
(2) 第一次未被抽中,第二次抽中 5/6 * 1/5 = 1/6
(3) 第一次抽中與第二次抽中是互斥事件,所以,在這次抽樣過程中,
個體a被抽中的概率為 1/6 + 1/6 = 2/6。
上述抽樣過程如何用計算機進行模擬呢?
思路:依次遍歷總體n中的每乙個元素,並通過一種隨機測試對每個元素進行決策(選與不選),將被選元素輸出。
所以,上述思路關鍵在於那個隨機測試,由於是簡單隨機抽樣,每個元素被選可能為n/n,所以**如下:
view source
print?
1.
for
(
int
i = 0; i < n; i++)
2.
這種做法雖然每個元素以n/n的概率被選,但又可能最後選取的元素小於n, 也極有可能大於n,因此這種做法不可。
我們以 (n-m) / (n - i) 的概率選取第t+1個元素。(m已經選取元素的個數, t已經遍歷的元素數)
view source
print?
01.
select = n
02.
remaining = n
03.
for
(i = 0; i < n; i++)
04.
10.
remaining--;
11.
}
這樣,貌似每個元素不是以n/n的概率進行抽取的。
這裡混淆了條件概率與無條件概率,每乙個元素被選取的概率依賴於前一元素的選取情況。
(1)假設以等概率n/n的概率選擇了第乙個元素,那麼在剩下n-1個元素中選擇n-1個元素,等概率,
選取乙個元素為(n-1)/(n-1),即第二個元素的概率為(n-1)/(n-1).
(2)不選擇第乙個元素(1-n/n),而選擇了第二個元素,則選擇第二個元素概率 n/(n-1).
(3)最終選取第二個元素的概率為(n/n)*((n-1)/(n-1)) + (1-n/n)*(n/(n-1)) = n/n.
所以上述**模擬了隨機抽樣,可以採用歸納法進行證明。
若不選擇元素t,則remaining--,即以 select /(remaining - 1) 概率選擇第t+1個元素。
若選擇元素t, 則select--, remaing--,即以(select-1) / (remaining - 1) 選擇第t+1個元素。
可以這樣理解:
圖一中,若隨機數一值落於select - remaining 區間中,remaining會一直縮小,如圖二中。
當remaining與select重合的時候,每次都會選擇乙個數。通過這種限制,保證取得的資料個數正好為select。
二、蓄水池抽樣
問題:樣本總數n未知,從中取n個(n≤n),最終要求每個數等概率被取得,n/n.
步驟:1. 先將前n個元素放入蓄水池,對於後續元素,以n/a的概率決定是否取該元素( n < a ≤ n)。
2. 若選取了某個元素a(序號也為a),則要替換蓄水池中的乙個元素,採用隨機方法,以概率1/n來
選擇乙個元素(假如b)進行替換。
證明:元素a最終(即抽樣結束)被選擇的概率為 =
a被選中的概率 *
所以,每個元素被選取的概率為n/n,為等概率抽樣。
**:view source
print?
1.
a = n + 1;
2.
while
has more input lines
3.
choice = random(1, a);
4.
if
( a <= n)
5.
swap(choice, a);
6.
a++
1. 將前n個元素放入蓄水池
2. choice為1-a之間的隨機數字
3. 若 choice <=n, 即以n/a的概率選擇這一行
4. choice同時為n中某個元素的下標,將此下標的元素進行替換。
在0-a直接隨機選取乙個數字,如果落到0-n的區間內,則說明概率為n/a.
隨機化演算法
隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...
隨機化演算法基礎
隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為1 n 下面,有兩個常用的演算法來實現輸入分布的隨機化,以給定的輸入陣列...
c語言 隨機化演算法
srand unsigned int time null 若不隨機則生成的都為1 相同值 做產生隨機數的種子 x double rand rand max rand 後若為 則是隨機生成0 1之間的數 若為 則是生成0 rand max之間的數 rand max為最大值32767 rand 前為產生...