面試中的概率題


期望題

1. 拋一個6面的骰子,連續拋直到6為止,問期望的拋的次數是多少
設期望次數為E,那么有:
[1]1次拋出6的概率為1/6,那么期望次數為1*1/6
[2]本次拋出非6數字的概率為5/6,因為沒有拋出6,因此期待拋出6還需要執行試驗的次數仍為E,需要注意加上本次(1次)失效的拋擲,即期望次數為(1+E)(5/6)

綜合可得:
E = 1*(1/6) + (1+E)(5/6)

解得: E = 6

2. 一個木桶里面有M個白球,每分鍾從桶中隨機取出一個球塗成紅色(無論白或紅都塗紅)再放回,問將桶中球全部塗紅的期望時間是多少?

令E[i]表示木桶里有i個紅球時,還需要抽取多少時間可以將所有球都染成紅色,對於當前狀態下E[i]的計算可以分解為兩個部分:
[1] 抽取到的是紅球: 需要的時間期望為 i/M * (1+E(i)),其中i/M表示抽取紅球的概率,因為抽取到的是紅球因此狀態沒有改變,仍然是E(i)
[2] 抽取到的是白球: 需要的時間期望為 (1-i/M) * (1+E(i+1)),其中(1-i/M)表示抽取到白球的概率,因為抽取到了白球,被塗成紅色以后,木桶里將會有i+1個紅球,因此狀態遷移到 E(i+1)
注意加上當前實驗的時間 1
綜合可得:
E(i) = i/M *(1+E(i)) + (1-i/M) * (1+E(i+1))
化簡可得:
E(i) = E(i+1) + M/(M-i)
顯然有: E(M) = 0, 當前桶里M個球都是紅色的,不用再做任何抽取操作
(編程時依次從E(M)計算到E(0),返回E(0)即可)

將遞歸式展開有:E(0) = M/M + M/(M-1) + ... + M/1 + 0

3. 若要使骰子(六個面)的每個數都出現至少一次,那么平均需要擲多少次骰子?即求擲骰子次數的期望

與前一題類似,設擲出第i個數需要拋擲的次數為E(i),i=1,2,3,4,5,6,(需要注意的是第i個數是值之前沒有出現過的數字,而不是具體的值)
那么E(i)可由兩部分組成:
E(i) = (i/6)(E(i)+1) + (1-i/6)(E(i+1)+1)

[1] (i/6)(E(i)+1) : 已經有i個數字出現了,那么當前拋擲出重復數字的概率為 i/6,狀態仍然是E(i),加上當前實驗1次
[2] (1-i/6)(E(i+1)+1) : 已經有i個數字出現了,那么當前拋擲出新數字的概率為 1-i/6,狀態轉移到E(i+1),即當拋擲出了i+1個數字后,仍需要拋擲次數的期望,別忘加當前試驗 1 次

E(i) = E(i+1) + 6/(6-i), E(6) = 0

E(0) = 6/6 + 6/(6-1) + ... + 6/1 + 0

4. 你有一把寶劍。每使用一個寶石,有50%的概率會成功讓寶劍升一級,50%的概率會失敗。如果寶劍的級數大於等於5的話,那么失敗會使得寶劍降1級。如果寶劍的級數小於5的話,失敗沒有效果。問題是:期望用多少個寶石可以讓一把1級的寶劍升到9級?

令 E(i) 表示寶劍從 i-1 級升到 i 級需要的寶石個數,對於E(i)有:

對於 i <= 5, 沒有失敗,因此 E(1) = E(2) = E(3) = E(4) = E(5) = 2

對於 i >= 5, 有:
E(i) = (1/2)*1 + (1/2)*(1 + E(i-1) + E(i))
從i-1級升到i級,
[1] 升級成功,成功概率為 1/2,耗費 1 顆寶石,因此期望的寶石數為:(1/2)*1
[2] 升級失敗,失敗概率為 1/2,耗費 1 顆寶石,等級降到 i-2級,因此需要從 i - 2 級升到 i-1級,需要E(i-1)次,再從i-1級升到i級需要E(i)次,綜上有:(1/2)*(1 + E(i-1) + E(i))

化簡得:E(i) = 2 + E(i-1)

E(6) = 2 + E(5) = 2 + 2 = 4
E(7) = 2 + E(6) = 2 + 6 = 6
E(8) = 2 + E(7) = 8
E(9) = 2 + E(8) = 10

那么寶劍從1級升到9級,期望需要的寶石數是: E(2) + ... + E(9) = 36

幾個關鍵概念

以上分析過程涉及到的三個重要概念如下:

1. 伯努利實驗
事件E只有兩種可能結果:發生和不發生,概率分別為p和(1-p)。E獨立重復進行n次可以稱為n次伯努利試驗。

2. 二項分布
n次伯努利試驗發生k次的可能性服從二項分布:
c(n,k) * p^k * (1-p)^(n-k)

3. 幾何分布
幾何分布有是指以下任一一種情況的離散型概率分布:
[1] 1次成功需要執行伯努利試驗的次數X,(X=1,2,3...)
[2] 1次成功之前失敗的次數 Y = X-1 =, (Y=0,1,2....).

注意區分以上兩種情況,以上兩種情況的概率分布為:
[1] P(X=k) = (1-p)(k-1) * p , k = 1,2,... (第k次是第一次成功)
[2] P(X=k) = (1-p)k * p , k = 0,1,2,... (失敗了k次以后第一次成功)

以上兩種情況下的幾何分布的均值和方差:
[1] E(X) = 1/p , D(X) = (1-p)/p2
[2] E(X) = (1-p)/p, D(X) = (1-p)/p2

舉例:
一個六面的骰子,平均需要投擲多少次可以擲出數字6:
p = 1/6, 1-p = 5/6
E(X) = 1/p = 6 次

詳細可以參考:
https://en.wikipedia.org/wiki/Geometric_distribution

隨機數題

關鍵在於保證各個隨機數出現的概率相等。

1. 已知有個rand7()的函數,返回1到7隨機自然數,怎樣利用這個rand7()構造rand10(),隨機1~10。

因為rand7()可以等可能的產生 1~7 之間的數字,因此 (rand7() - 1)等可能隨機產生 0~6 的數,那么(rand7() - 1) * 7 + rand7() 可以等可能的產生 1~49 之間的數,因為上式中兩個rand7()的組合數是唯一的。

可以將1~49分成 1~40 和 41~49兩個區間,選擇 1~40這個區間平均划分成10段,每一個分段被隨機到的概率相等,每個分段的長度為40/10 = 4,每個分段分別對應1~10。

具體過程為:按公式 (rand7() - 1) * 7 + rand7() 隨機一個數,若隨機數落入41~49這個區間則丟棄,若隨機數落入1~40這個區間,進一步確定分段對應的數值 (x-1)/4 + 1

2. 已知有個randM()的函數,返回1到M隨機自然數,怎樣利用這個randM()構造randN(),隨機1~N。

前一題的推廣。分兩種情況:
[1] 當 N <= M 時,可以直接使用 randM() 獲取隨機數,>N的隨機數丟棄,<=N 的隨機數輸出即可。
[2] 當 N > M 時候,需要構造 randM2 = (randM() - 1) * M + randM() 隨機 1 ~ M2 的數值,
[3] 如果randM2仍然小於N,那么對 randM2 繼續重復[2] 操作,如果randM2大於 N 則停止跳到 [1]

3. 已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,現在要你構造一個發生器,使得它產生0和1的概率均為1/2

由題目有:
0 : p
1 : 1-p

連續產生兩個數,其組合以及概率如下:
00 : p2
01 : p*(1-p)
10 : (1-p)*p
11 : (1-p)2

可以發現 01 和 10 組合的概率是相等的,只需要將其分別映射到0和1即可。即每次隨機產生兩個數,如果組合為00或11則丟棄,若為01則映射到1,若為10則映射到0,這樣一來產生0和1的概率均為 1/2 。

4. 已知一隨機發生器,產生的數字的分布不清楚,現在要你構造一個發生器,使得它產生0和1的概率均為1/2。

使用該隨機發生器產生隨機數a,b,有以下3種情況:(1)a<b, (2) a == b, (3) a>b,其中情況(1)和(3)是對稱的,發生的概率相等,只需要將這兩種情況分別映射到0和1即可,其中遇到a==b時忽略。

(也可以找另外一個概率相等的閾值)

**5. 已知一隨機發生器,產生0的概率是p,產生1的概率是1-p,構造一個發生器,使得它構造1、2、3的概率均為1/3;…。更一般地,構造一個發生器,使得它構造1、2、3、…n的概率均為1/n。 **

隨機等可能的產生n個數,需要構造n個等可能的事件,每一個事件的發生映射到一個數值上即可。

我們可以產生一個由0和1組成的序列,序列中0和1的個數相等,即各出現一半的情況下每種排列出現的概率都是相等的。

隨機產生長度為2x的序列,那么0和1各占x個,組合數有 C(2*x, x) >= n ,解出最小的x。對其中的n種等可能情況分別映射到1~n的數字上即可。

6. 給出從n個數中隨機選擇m個數的方法。n很大,可以認為是億級別。m可以很小,如接近1;也可以很大,如接近n。

兩個有待改進的思路:
(1) 以 1/n 的概率一直重復隨機,直到獲取了m個數為止
缺陷:[1]難以知道后面隨機的數是否與前面的隨機數重復,因為數據量很大,不一定能在內存中進行比較。[2] 當m很大時,尤其是無限接近n時,后面產生的數字很多都已經在前面出現過。
(2)每個數字被選中的概率是 m/n,可以遍歷所有數字,在遍歷的同時以 m/n的概率決定是否選擇當前值。當遍歷結束時,選擇數字的個數在平均意義上來說是m,均值會隨着數據量的增大會更好的趨向於m,但值得注意的是該過程仍不能精確的精確到m。

改進后的思路:
遍歷第1個數時,選擇的概率為 m/n
遍歷第2個數時,[1]如果選擇了第一個數,則選擇的概率為 (m-1)/(n-1);[2] 如果沒有選擇第1個數,則選擇的概率為 m/(n-1)
遍歷第i個數時,[1]如果此時已經選擇了k個數,那么選擇第i個數的概率為 (m-k)/(n-i+1)
這樣一來可以保證在剩下的數字中選擇適當的數使得總體的數字是m個。對於選擇概率 (m-k)/(n-i+1) ,當k=m時概率為0,即所有數字已經選擇完畢不再選擇,當k=0時,分母會不斷減小,以至於概率取向於1。最終得到的結果始終精確到m個數。

7. 給出從n個數中隨機選擇1個的方法。注意,n非常大,並且一開始不知道其具體值。數字是一個一個給你的,當給完之后,你必須立刻給出隨機的結果。

由於n非常大並且需要立即給出答案,因此無法把所有數字都保存起來然后進行隨機。
再者n的具體值未知,因此任意時刻都需要有當前的結果。

於是第1個數字肯定選。那么問題就變成了當第i個數字到來時,是保留當前數字還是選擇第i個數字的問題,i=2,3,...,n。此過程必須保證截止目前為止所見到的數字被選中的概率都相等。

假設當第i個數字到來時,前i-1個數字被選中的概率相等,此時只需要第i個數字被選中的概率為1/i即可保證當前的i個數字被選中的概率相等。因為截止目前見到的數字總共有i個,可以分成兩個部分,即前i-1個數和第i個數,第i個數被選中的概率為1/i,那么不被選中的概率就為 (i-1)/i ,這時被選中的應該是前i-1個數中的一個,由假設可知前i-1個數被選中的概率相等,那么前i-1個數字任一一個被選中的概率為 ((i-1)/i)/(i-1) = 1/i。

8. 給出從n個數中隨機選擇m個的方法。注意,n非常大,並且一開始不知道其具體值。數字是一個一個給你的,當給完之后,你必須立刻給出隨機的結果。

本題是上一題的擴展。
首先前m個數是必須取的,問題就變成了,當第i(i>m)個數到來時,是丟棄這個數還是保留這個數,如果保留這個數(第i個數),那么就需要從已選的m個數中選中一個丟棄。

具體做法是,選取前m個數,依次讀取第i(i>m)個數,並以 m/i 的概率決定是否選擇這個數,如果選擇了這個數,則隨機的替換掉當前m個數中的任意一個。

具體解釋如下:
假設前i-1個數字任一個被選中的概率相等,為 m/(i-1)。
當第i個數字到來時被選中的概率為m/i(由定義可知),現在計算前i-1個數字中任一一個數字 k 被保留的概率,有兩種情況:[1]第i個數字沒被選中,那么k直接被保留,概率為(1-m/i); [2] 第i個數字被選中(m/i),並且刪除當前m個數字中的一個,被刪除的數字不是k(1-1/m),於是k仍然被保留的概率為 (m/(i-1)) * [ (1-m/i) + (m/i) * (1-1/m) ] = m/i

由數學歸納法依次類推,當遍歷完n個數,選中m數中,每個數被選擇的概率都是相等的。

概率題

1. 在半徑為1的圓中隨機選取一點

可作單位圓如下圖所示,[-1,1]隨機x的值,[-1,1]隨機y的值,可以得到圓內隨機一點 (x,y)。當然也可以使用極坐標進行隨機。

2. 一根木棒,截成三截,組成三角形的概率是多少?

假設一個木棒長為1,三截的長度分別為 x, y , 1-x-y,由此可以轉換成線性規划問題。

長度大於0小於1,因此有以下約束條件:
0 < x < 1
0 < y < 1
0 < 1-x-y < 1
(圖中紅色直線表示 x+y=1,因此滿足以上三個約束的區域在紅色直線以下的三角形區域,概率為: 1*1*(1/2) = 1/2 )

又由三角形兩邊之和大於第三邊的條件有以下三個約束:
x + y > 1 - x - y
x + 1-x-y > y
y + 1-x-y > x
化簡有:
x + y > 1/2
y < 1/2
x < 1/2
(由約束可得圖中陰影部分,概率為: (1/2)*(1/2)*(1\2) = 1/8)

綜合以上所有約束有:
一根木棒,截成三截,組成三角形的概率是: (1/2)*(1/8) = 1/16

參考:
[1] http://blog.csdn.net/dengm155/article/details/52658836
[2] https://zhidao.baidu.com/question/1737334723808514107.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM