星期二男孩问题

最近流行这样一道题:一个人有两个小孩,其中有一个是生于星期二的男孩儿,问另一个是男孩儿的概率是多少?

如果从比较严格的角度来看,这道题可能会有一些问题,比如双胞胎、多胞胎怎么办?男女出生比例是精确的 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

看来,题目中的星期二并不是无用条件,而且最后得到的结果似乎会与直觉相悖,但认真检查了几遍上面的计算推导过程之后,我觉得事实似乎应该就是如此。

分类:文章标签:概率数学趣题Python

相关文章:

评论:

Edgar

我觉得你的算法不对,其实你合并了相同项,既然("1b", "2b")、("2b", "1b")算两种情况,那么("2b", "2b")也应该是两种情况,即男孩的概率是14/28,也即50%

oldj

("1b", "2b")、("2b", "1b")的确是两种情况:
前一种表示第一个孩子是星期一出生的男孩,第二个孩子是星期二出生的男孩;
后一种表示第一个孩子是星期二出生的男孩,第二个孩子是星期一出生的男孩;
这是两种不同的情况。

而("2b", "2b")则只有一种情况,表示:
第一个孩子是星期二出生的男孩,第二个孩子也是星期二出生的男孩;

就像("1b", "1b")只有一种情况一样,("2b", "2b")也只有一种情况。

Edgar

那么换一个说法a、甲男孩周一出生,乙男孩周二出生b、乙男孩周一出生,甲男孩周二出生c、甲男孩周二出生,乙男孩周二出生d、乙男孩周二出生,甲男孩周二出生c、d中的两个周二其实是不同的我倒觉得从一开始就将这个问题复杂化从无序的排列组合的角度讲,a和b其实是一种情况,c和d也是一种情况

oldj

c、d两种情况为什么不同呢?
我们来看一下下面的a'和b':

a、甲男孩周一出生,乙男孩周二出生
a'、乙男孩周二出生,甲男孩周一出生
b、乙男孩周一出生,甲男孩周二出生
b'、甲男孩周二出生,乙男孩周一出生

如果c、d是不同的,那a、b也应该再各分出两种情况,并且a和a'是不同的,b和b'是不同的。
这样相当于每种情况都考虑两遍,最后的结果是26/54,约简后还是等于13/27啊。

干嘛必填

其中有一个是生于星期二的男孩儿,问另一个是男孩儿的概率是多少,表示为这1个是男孩,另一个是男孩儿的概率而lz的算法表示为有一个是2b但不确定是哪个,另一个是b的概率,那么2b,2b则应该出现2次,非一次

oldj

(2b, 2b) 只会出现一次啊。就像丢两枚硬币,有四种可能:(正, 反)、(反, 正)、(正, 正)、(反, 反),概率各为 1/4。其中 一正一反的情况出现了两次:(正, 反)、(反, 正),那是不是说两面都为正的情况 (正, 正) 也应该出现两次呢?不是这样。星期二男孩问题中的 (2b, 2b) 也只会出现一次,虽然更复杂一些,但原理是一样的。

另外,这篇博客的后续说得可能更清楚一些。:-)

路过的假面

纠结(2b,2b)的脑子都乱的...............没人注意到关键问题是少了2g 2g嘛。。。分母分子都少了1。所以才出现的13/27.....

路过路过的假面的假面

跟2g,2g有什么关系呢?
难道不是因为分子和分母都少了一个2b,2b么?

发表评论: