最近流行这样一道题:一个人有两个小孩,其中有一个是生于星期二的男孩儿,问另一个是男孩儿的概率是多少?
如果从比较严格的角度来看,这道题可能会有一些问题,比如双胞胎、多胞胎怎么办?男女出生比例是精确的 1:1 吗?等等。不过如果我们不去纠结这些细节问题,假设两个小孩不是双胞胎,男女出生比例为精确的 1:1,也没有其他特殊的情况,那结果会是什么样呢?
我刚看到这道题时,第一个反应是答案肯定是 50% 嘛,两个孩子的性别是独立的,不论一个孩子的性别是什么都不会影响到另一个(不考虑极端或特殊情况),至于题目中的“星期二”……,大概是一个迷惑人用的无用信息吧。但仔细算过之后,我却得到了另外的结果。
为了方便描述,我们用 "1", "2", "3", "4", "5", "6", "7" 表示周一至周日出生,"b", "g" 表示那个孩子是男孩还是女孩,比如 "2b" 就表示某个孩子是周二出生并且是男孩,"3g" 则表示某个孩子是周三出生并且是女孩。然后我们穷举一下周一至周日 7 天出生的两个孩子的所有可能性,如:
("1b", "1b"), ("1b", "1g"), ("1b", "2b"), ("1b", "2g") ..., ("7b", "7g"), ..., ("7g", "7g")
一共有 14 * 14 = 196 种可能。
我们再找出其中包含星期二出生的男孩的项,即包含 "2b" 的项,一共有 27 种,如下:
("1b", "2b"), ("1g", "2b"), ("2b", "1b"), ("2b", "1g"), ("2b", "2b"),
("2b", "2g"), ("2b", "3b"), ("2b", "3g"), ("2b", "4b"), ("2b", "4g"),
("2b", "5b"), ("2b", "5g"), ("2b", "6b"), ("2b", "6g"), ("2b", "7b"),
("2b", "7g"), ("2g", "2b"), ("3b", "2b"), ("3g", "2b"), ("4b", "2b"),
("4g", "2b"), ("5b", "2b"), ("5g", "2b"), ("6b", "2b"), ("6g", "2b"),
("7b", "2b"), ("7g", "2b")
27 种……,慢着,是 27 种?
27 是奇数,不能被 2 整除,也就意味着另一个孩子也是男孩概率不可能能是 50%。
我们来数一下这 27种可能里另一个孩子也是男孩的情况有多少种,结果是 13 种。
也就是说,已知一个孩子是星期二出生的男孩的情况下,如果不考虑双胞胎等意外因素,另一个孩子也是男孩的可能性是 13/27 ,小于 50%。
上面的推导是很暴力的穷举,当然不是用手工算的,而是一段 Python 脚本,如下:
# -*- coding: utf-8 -*-
def main():
days = range(1, 8)
gender = ("b", "g")
c1 = ["%d%s" % (d, g) for d in days for g in gender]
c2 = ["%d%s" % (d, g) for d in days for g in gender]
all = [(i1, i2) for i1 in c1 for i2 in c2]
print u"两个孩子的出生星期及性别共有 %d 种可能" % len(all)
b2 = [i for i in all if "2b" in i]
print "-" * 50
print u"有一个孩子是星期二出生的男孩的情况:"
print b2
print u"共 %d 种情况" % len(b2)
a = [i for i in b2 if "b" in i[0] and "b" in i[1]]
print "-" * 50
print u"另一个孩子也是男孩的情况:"
print a
print u"共 %d 种情况" % len(a)
print "-" * 50
print u"最终概率:%d/%d" % (len(a), len(b2))
if __name__ == "__main__":
main()
最后的输出结果为:
两个孩子的出生星期及性别共有 196 种可能
--------------------------------------------------
有一个孩子是星期二出生的男孩的情况:
[
('1b', '2b'), ('1g', '2b'), ('2b', '1b'), ('2b', '1g'), ('2b', '2b'),
('2b', '2g'), ('2b', '3b'), ('2b', '3g'), ('2b', '4b'), ('2b', '4g'),
('2b', '5b'), ('2b', '5g'), ('2b', '6b'), ('2b', '6g'), ('2b', '7b'),
('2b', '7g'), ('2g', '2b'), ('3b', '2b'), ('3g', '2b'), ('4b', '2b'),
('4g', '2b'), ('5b', '2b'), ('5g', '2b'), ('6b', '2b'), ('6g', '2b'),
('7b', '2b'), ('7g', '2b')
]
共 27 种情况
--------------------------------------------------
另一个孩子也是男孩的情况:
[
('1b', '2b'), ('2b', '1b'), ('2b', '2b'), ('2b', '3b'), ('2b', '4b'),
('2b', '5b'), ('2b', '6b'), ('2b', '7b'), ('3b', '2b'), ('4b', '2b'),
('5b', '2b'), ('6b', '2b'), ('7b', '2b')
]
共 13 种情况
--------------------------------------------------
最终概率:13/27
看来,题目中的星期二并不是无用条件,而且最后得到的结果似乎会与直觉相悖,但认真检查了几遍上面的计算推导过程之后,我觉得事实似乎应该就是如此。
评论:
前一种表示第一个孩子是星期一出生的男孩,第二个孩子是星期二出生的男孩;
后一种表示第一个孩子是星期二出生的男孩,第二个孩子是星期一出生的男孩;
这是两种不同的情况。
而("2b", "2b")则只有一种情况,表示:
第一个孩子是星期二出生的男孩,第二个孩子也是星期二出生的男孩;
就像("1b", "1b")只有一种情况一样,("2b", "2b")也只有一种情况。
我们来看一下下面的a'和b':
a、甲男孩周一出生,乙男孩周二出生
a'、乙男孩周二出生,甲男孩周一出生
b、乙男孩周一出生,甲男孩周二出生
b'、甲男孩周二出生,乙男孩周一出生
如果c、d是不同的,那a、b也应该再各分出两种情况,并且a和a'是不同的,b和b'是不同的。
这样相当于每种情况都考虑两遍,最后的结果是26/54,约简后还是等于13/27啊。
另外,这篇博客的<a href="http://oldj.net/article/the-tuesday-boy-problem-2/" rel="nofollow">后续</a>说得可能更清楚一些。:-)
难道不是因为分子和分母都少了一个2b,2b么?