程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> 星期二男孩問題 算法分析

星期二男孩問題 算法分析

編輯:Python

最近流行這樣一道題:一個人有兩個小孩,其中有一個是生於星期二的男孩兒,問另一個是男孩兒的概率是多少?

如果從比較嚴格的角度來看,這道題可能會有一些問題,比如雙胞胎、多胞胎怎麼辦?男女出生比例是精確的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

 

看來,題目中的星期二並不是無用條件,而且最後得到的結果似乎會與直覺相悖,但認真檢查了幾遍上面的計算推導過程之後,我覺得事實似乎應該就是如此。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved