这个问题其实不难,只是很多时候,尤其在没有任何提示的时候,容易想错。条件概率的题目一定要看清楚条件信息。

问题描述:老王有两个孩子,已知至少有一个孩子是在星期二出生的男孩。问:两个孩子都是男孩的概率是多大?【假设生男生女的概率相等】

刚看到题目的时候,我也愣了一下:一个孩子星期二出生,对于另一个孩子是不是男孩有什么影响吗?

先说一下,这道题的答案是 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 发生的概率。根据贝叶斯公式,容易知道:

\begin{equation*} P(B|A)=\frac{P(AB)}{P(A)}=\frac{P(A|B)P(B)}{P(A)} \end{equation*}

依次算出等号右边的各个概率值:

  • 在已知两个孩子都是男孩的条件下,至少有一个是周二出生的男孩:\(P(A|B)=1-{(\frac{6}{7})}^2=\frac{13}{49}\)
  • 两个孩子都是男孩:\(P(B)=\frac{1}{4}\)
  • 至少有一个孩子是周二出生的男孩:\(P(A)=1-{(\frac{1}{2}\times\frac{6}{7}+\frac{1}{2})}^2=\frac{27}{196}\)

因此可以求出:\(P(B|A)=\frac{P(A|B)P(B)}{P(A)}=\frac{13}{49}\times\frac{1}{4}\div\frac{27}{196}=\frac{13}{27}\)

苦逼的无证程序员的解题方法

无证程序员小周看到题目后,二话不说,写了一小段程序(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) 非常接近。

Like this post? Share on: TwitterFacebookEmail

Comments

So what do you think? Did I miss something? Is any part unclear? Leave your comments below.

comments powered by Disqus

Keep Reading


Published

Last Updated

Category

数学

Tags

Stay in Touch