老王有兩個孩子,已知至少有一個孩子是在星期二出生的男孩。問:兩個孩子都是男孩的概率是多大?

這個問題其實不難,只是很多時候,尤其在沒有任何提示的時候,容易想錯。條件概率的題目一定要看清楚條件信息。

問題描述:老王有兩個孩子,已知至少有一個孩子是在星期二出生的男孩。問:兩個孩子都是男孩的概率是多大?【假設生男生女的概率相等】

剛看到題目的時候,我也愣了一下:一個孩子星期二出生,對於另一個孩子是不是男孩有什麼影響嗎?

先說一下,這道題的答案是 13 / 27,如果你算出來的不是這個數,那建議你繼續往下看看。

思維縝密的項目經理的解題思路

項目經理小李,雖然數學功底不深,編程技術不精,但有個很大的好處是處事不驚,有條不紊。看到題目之後,略加思索,就用最簡單的辦法弄懂了這個問題,並求出了結果。

首先看如果只知道老王有兩個孩子,其他信息都不知道的情況下,兩個孩子都是男孩的概率顯然是1/4。

再來看看沒有“星期二”這個條件的情況,題目變成:老王有兩個孩子,已知至少有一個孩子是男孩,問兩個孩子都是男孩的概率是多大?那結果顯然是1/3。因爲在“至少有一個男孩”這樣的條件下,只有三種可能:兄妹倆、姐弟倆、兄弟倆。這三種情況是等概率的,而只有一種情況是兩個男孩,因此是1/3。

最後再把星期二也考慮進來。還是在上面的基礎上擴展,先按照兩個孩子的四種可能的性別組合進行劃分,然後在每種組合裏看看滿足有至少一個週二男孩的情況數目:

  • 姐妹倆:不用看了,不滿足至少有一個週二男孩的條件。
  • 兄妹倆:那哥哥一定是週二出生的了,妹妹出生的星期數有7種可能。
  • 姐弟倆:弟弟一定是週二出生,姐姐出生的星期數有7種可能。
  • 兄弟倆:兄弟二人出生的星期數總共有7 * 7 = 49種可能,但其中有6 * 6 = 36種都不滿足至少有一個人是週二出生的條件,因此實際上有49 - 36 = 13種可能。

因此,滿足條件的情況(這裏的情況是指綜合考慮孩子的性別和出生星期數)總數爲7 + 7 + 13 = 27。而其中有13中可能對應於兩個孩子都是男孩。因此題目所求概率是13 / 27

沒錯,13 / 27就是這道題的答案,出現這樣的數字是因爲已知條件所提供的信息使得樣本空間發生了變化(變小了一點兒)。這就是條件概率帶來的影響。

博學多才的數據挖掘專家的解題思路

小陳是一個有豐富的數據挖掘和機器學習經驗的專家,在聽到這個題目的時候,想都沒想,乾脆地說:“這題簡單,用貝葉斯公式就能搞定”。

根據題目,可以認定兩個事件,事件A是:至少有一個週二出生的男孩;事件B是:兩個孩子都是男孩。題目要求的是P(B|A)即在事件A發生的條件下,事件B發生的概率。根據貝葉斯公式,容易知道:

P(B|A)=P(AB)P(A) =P(A|B)P(B)P(A)  P(B|A)=P(AB)P(A)=P(A|B)P(B)P(A)

依次算出等號右邊的各個概率值:

  • 在已知兩個孩子都是男孩的條件下,至少有一個是週二出生的男孩:P(A|B)=1(67 ) 2 =1349  P(A|B)=1−(67)2=1349
  • 兩個孩子都是男孩:P(B)=14  P(B)=14
  • 至少有一個孩子是週二出生的男孩:P(A)=1(12 ×67 +12 ) 2 =27196  P(A)=1−(12×67+12)2=27196

因此可以求出:P(B|A)=P(A|B)P(B)P(A) =1349 ×14 ÷27196 =1327  P(B|A)=P(A|B)P(B)P(A)=1349×14÷27196=1327

苦逼的無證程序員的解題方法

無證程序員小周看到題目後,二話不說,寫了一小段程序(Python)來計算概率的近似值:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from random import Random

def IsTwoBoys(rand):
  genders = ('M', 'F')
  weekdays = tuple(range(1, 8))
  while True:
    children = [(rand.choice(genders), rand.choice(weekdays)) for i in xrange(2)]
    if ((children[0][0] == 'M' and children[0][1] == 2) or
        (children[1][0] == 'M' and children[1][1] == 2)):
      return True if children[0][0] == children[1][0] == 'M' else False

cnt = 1000000
twoboys = 0
rand = Random()
for i in xrange(cnt):
  if IsTwoBoys(rand):
    twoboys += 1
print 'p(twoboys) =', twoboys, '/', cnt, '=', float(twoboys) / cnt

運行結果,題目所求概率值近似爲:0.48213,與13 / 27 = 0.(481)非常接近。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章