球隊兩強相遇
8只球隊,有3個強隊,其餘都是弱隊,隨機把它們分成4組比賽,每組兩個隊,問兩強相遇的概率是多大?
解題思路:
- 首先求出8只球隊分成4組的方法數:第一隊有7種,第二隊有5種,第三隊有3種,第四隊就剩下1種,所以總數爲 7 × 5 × 3 × 1 = 105 種。
- 沒有兩強相遇的方法數:在5個弱隊中選出3個與強隊配對,總數爲 C(5,3) × A(3,3) = 60 種。
- 兩強不相遇的概率爲:(105-60)/105 = 3/7。
螞蟻碰頭
三隻螞蟻從正三角形的三個頂點沿着邊移動,速度是相同的,問它們碰頭的概率是多少?
解題思路:
如果3只螞蟻方向都相同,一定不會相遇,所以3只螞蟻方向一定有不同。
每隻螞蟻方向數有2種,一共3只螞蟻,一共有 23 = 8 種方向排列。
其中,只有完全順時針和完全逆時針這2種情況下不相遇,所以相遇的概率爲:
(8-2) / 8 = 0.75
男女比例
某地區重男輕女,一個家庭如果生出一個女孩就一直生,直到生出男孩就停止生育。假設一胎只出生一個孩子,問時間足夠長後,男女比例是會變爲多少?
解題思路:
假設這個地區一共有n個家庭:
n/2 的家庭第一胎就生出男孩,所以只有1個孩子。
n/4 的家庭先生1女孩,再生1男孩,有2個孩子。
n/8 的家庭先生2女孩,再生1男孩,有3個孩子。
…
所以孩子總數爲:
n/2 + (n/4)×2 + (n/8)×3 + (n/16)×4 + … + n/2^n×n = 2 × n
(求解過程:兩邊同乘2,再錯位相減。)
因爲每個家庭都會有一個男孩,所以男孩有n個,則女孩數爲 2n-n = n 個
所以比例爲 1:1
隨機函數
給定一個等概率隨機產生1-5的隨機函數,除此之外,不能使用任何額外的隨機機制,請實現等概率隨機產生1-7的隨機函數。
解題思路:
- 等概率隨機函數產生 1、2、3、4、5
- 將上述結果-1,將得到 f() ,其結果爲0、1、2、3、4
- f() × 5 的結果爲0、5、10、15、20
- f() × 5 + f() 的結果爲0、1、2、3、4、5 … 24
- 如果步驟4的結果大於20,則重複步驟4,直到結果在0-20之間
- 步驟5的結果將等概率隨機產生0-20,所以步驟5的結果**%7**之後就可以等概率產生0-6
- 再將步驟6的結果+1即可
等概率產生0和1
給定一個以p概率產生0,以1-p概率產生1的隨機函數f(),p是固定的值,但你並不知道是多少。除此之外也不能使用任何額外的隨機機制,請用f()實現等概率隨機產生0和1的隨機函數。
解題思路:
產生01和10序列的概率都爲 P × (1-P),所以不斷調用f,直到產生的結果爲01或10。如果產生了01,就返回0;如果產生了10,就返回1。
出現概率變爲k次方
假設函數f()等概率隨機返回一個在[0,1)範圍上的浮點數,那麼在[0,x)區間上的數出現的概率爲x(0<x<=1)。給定一個大於0的整數k,並且可以使用f()函數,請事先一個函數依然返回在[0,1)範圍上的數,但是在[0,x)區間上的數出現的概率爲x的k次方。
解題思路:
先找出將概率x調整至x2的方法:調用兩次f(),返回較大的數即可。
所以,同理,只需要調用k次f(),返回較大的數即可。
等概率打印
給定一個長度爲N且沒有重複元素的數組arr和一個整數M,實現函數等概率隨機打印arr中的M個數。
解題思路:
在0 - N-1中隨機得到一個位置a,打印arr[a],然後將a和N-1進行交換,在從0 - N-2中隨機得到一個位置b,打印arr[b],再與隊尾交換,… ,直到打印了M個數。
概率動態變化-蓄水池抽樣算法
原題:
有一個機器按自然數序列的方式吐出球,1號球,2號球,3號球等等。你有一個袋子,袋子裏最多隻能裝下K個球,並且除袋子以外,你沒有更多的空間,一個球一旦扔掉,就再也不可拿回。設計一種選擇方式,使得當機器吐出第N號球的時候,你袋子中的球數是K個,同時可以保證從1號球到N號球中的每一個,被選進袋子的概率都是k/N。
改編題:
有一個只能裝下10個球的袋子,當吐出100個球時,袋子裏有10個球,並且1-100號中的每一個球被選中的概率都是10/100。然後繼續吐球,當吐出1000個球時,袋子裏有10個球,並且1-1000號中的每一個球被選中的概率都是10/1000。繼續吐球,當吐出 i 個球時,袋子裏有10個球,並且1-i 號中的每一個球被選中的概率都是10/i。也就是隨着N的變化,1-N號球被選中的概率動態變化成k/N。
解題思路—蓄水池抽樣算法:
- 處理1-k號球時,直接放進袋子裏。
- 處理第 i 號球時,以 k/i 的概率決定是否將第 i 號球放進袋子中。如果不決定將第 i 號球放進袋子,直接扔掉第 i 號球。如果決定將第 i 號球放進袋子,那麼就從袋子裏的k個球中隨機扔掉一個,然後把第 i 號球放入袋子。
證明:
- 假設第 i 號球被選中並且 1<=i<=k,那麼在選第 k+1 號球之前,第 i 號球留在袋子中的概率是1。在選第 k+1 號球時,在什麼樣的情況下第 i 號球會被淘汰,只有決定將第 k+1 號球放進袋子,同時在袋子中的第 i 號球被隨機選中並決定扔掉,這兩個時間同時發生時第 i 號球纔會被淘汰。
也就是說,第 i 號球會被淘汰的概率是 ( k / (k+1) ) × (1/k) = 1/(k+1)。所以第 i 號球留下來的概率爲 1 - 1/(k+1) = k/(k+1)。這是1到k+1號球中第 i 號球被留下來的概率。- 在選第 k+2 號球時,什麼時候第 i 號球會淘汰呢,只有把 k+2 號球放進袋子,同時在袋子中的第 i 號球被隨機選中並決定扔掉,兩件事同時發生時第 i 號球才能被淘汰。
所以,第 i 號球會被淘汰的概率是 ( k / (k+2) ) × (1/k) = 1/(k+2)。所以第 i 號球留下來的概率爲 1 - 1/(k+2) = (k+1)/(k+2)。那麼,從1到k+2號球中第 i 號球被留下來的概率爲:k/(k+1) × (k+1)/(k+2)。- 以此類推,在選第 N 號球時,第 i 號球最終留在袋子裏的概率爲:
k/(k+1) × (k+1)/(k+2) × (k+2)/(k+3) × (k+3)/(k+4) × … × (N-1)/N = k/N- 同樣推理,假設第 i 號球被選中並且 k<i<=N,那麼在選第 i 號球之前,第 i 號球進入袋子中的概率是 k/i。在選第 i+1 號球時,在什麼樣的情況下第 i 號球會被淘汰,只有決定將第 i+1 號球放進袋子,同時在袋子中的第 i 號球被隨機選中並決定扔掉,這兩個時間同時發生時第 i 號球纔會被淘汰。
那麼,第 i 號球會被淘汰的概率是 ( k / (i+1) ) × (1/k) = 1/(i+1)。所以第 i 號球留下來的概率爲 1 - 1/(i+1) = i/(i+1)。所以,從第 i 號球被選中到第 i+1 號球的過程中,第 i 號球留在袋中的概率是 k/i × i/(i+1)。
所以,在選第 N 號球時,第 i 號球最終留在袋子裏的概率爲:
k/i × i/(i+1) × (i+1)/(i+2) × … × (N-1)/N = k/N