天天看點

C語言下泊松分布以及指數分布随機數生成器實作泊松分布指數分布

最近實驗室的項目需要實作模拟檔案通路序列,要求機關時間内的資料請求次數符合泊松分布,而兩次請求見的時間間隔符合指數分布。沒辦法隻好重新撿起已經丢掉多時的機率知識。于是也就有了這篇關于在c語言下符合泊松分布和指數分布的随機數生成器的實作。

在實際的事例中,當某一事件,比如進站乘客數量,電話交換機接收到的通話請求以固定的瞬時速率λ獨立且随機地出現時,就可以認為該事件在機關時間内發生的次數符合泊松分布。

首先必須由二項分布引出:

如果做一件事情成功的機率是 p 的話,那麼獨立嘗試做這件事情 n 次,成功次數的分布就符合二項分布。展開來說,在做的 n 次中,成功次數有可能是 0 次、1 次 …… n次。成功 i 次的機率是:

( n 中選出 i 項的組合數) * p ^ i * (1-p)^ (n-i)

以上公式很容易推導,用一點機率學最基本的知識就夠了。因為每一特定事件成功的機率是 p ,不成功的機率是 1-p 。i 次成功的事件可以任意分布在總共的 n 次嘗試中。把它們乘起來就是恰好成功 i 次的機率。

當我們把二項分布推而廣之後,就可以得到波松分布。

可以這樣考慮,在一個特定時間内,某件事情會在任意時刻随機發生(前提是,每次發生都是獨立的,且跟時間無關)。當我們把這個時間段分成非常小的時間片構成時,可以認為,每個時間片内,該事件可能發生,也可能不發生。幾乎可以不考慮發生多于一次的情況(因為時間片可被分的足夠小)。

當時間片分的越小,該時間片内發生這個事件的機率 p 就會成正比的減少。即:特定時間段被分成的時間片數量 n 與每個時間片内事件發生的機率 p 的乘積 n*p 為一個常數。這個常數表示了該事件在指定時間段發生的頻度。

回過頭來再來看這段時間内,指定事件恰好發生 i 次的機率是多少?代入上面推導出來的公式得到:

n * (n-1)... (n-i+1) / i! * p^i * (1-p) ^ (n-i) => np(np-p)...(np-ip+p) / i! * ((1-p) ^ (-1/p))^(-np) / (1-p) ^i

當 n 趨向無窮大時,p 趨向 0 。而此時 (1-p)^(-1/p) 趨向 e 。

上面這個公式可以劃簡為

C語言下泊松分布以及指數分布随機數生成器實作泊松分布指數分布

其中λ 事件發生的平均速率。

有了這些知識,那麼寫出符合泊松分布的随機數生成器程式也就不難了:

指數分布是一種連續的機率分布,通常可以用來描述連續的獨立随機事件發生的時間間隔。其機率密度函數為:

C語言下泊松分布以及指數分布随機數生成器實作泊松分布指數分布

其中λ是事件發生的平均速率。

C語言下泊松分布以及指數分布随機數生成器實作泊松分布指數分布

那麼其逆函數則為:

C語言下泊松分布以及指數分布随機數生成器實作泊松分布指數分布

是以其随機數生成器程式為:

繼續閱讀