三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是 1/3。换门的话,赢得汽车的几率是 2/3。
这个问题亦被叫做蒙提霍尔悖论:虽然该问题的答案在逻辑上并不自相矛盾,但十分违反直觉。这问题曾引起一阵热烈的讨论。
下面的代码来自《程序员的数学 2:概率统计》。
#!/usr/bin/ruby -s
# -*- coding: euc-jp -*-
# -*- Ruby -*-
def usage
name = File::basename $0
print <<EOU
#{name}: ¥â¥ó¥Æ¥£¥Û¡¼¥ëÌäÂê¤ò¥·¥ß¥å¥ì¡¼¥È
(Îã)
#{name} 10 ¢ª 10 ²ó»î¹Ô
(¥ª¥×¥·¥ç¥óÎã)
-c ¤Þ¤¿¤Ï -change ¢ª ¥ä¥®¤ò¸«¤ÆÈâ¤òÊѤ¨¤ë
-s=777 ¤Þ¤¿¤Ï -seed=777 ¢ª Íð¿ô¤Î¼ï¤ò»ØÄê
-help ¤Þ¤¿¤Ï -h ¢ª ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨
EOU
end
#####################################
if ($help || $h || ARGV.empty?)
usage
exit 0
end
$change ||= $c
$seed ||= $s
srand($seed.to_i) if $seed
$n = ARGV.shift.to_i
def choice(a)
a[rand(a.length)]
end
#####################################
$doors = 'ABC'.split //
$n.times{
car = choice $doors
you = choice $doors
goat = choice($doors - [car, you])
you = choice($doors - [you, goat]) if $change
result = (car == you) ? 'O' : 'X'
puts result
}
结果是更换选择更好。
$ make long
(no change)
./monty.rb 10000 | ../count.rb
O: 3327 (33.27%)
X: 6673 (66.73%)
(change)
./monty.rb -c 10000 | ../count.rb
O: 6609 (66.09%)
X: 3391 (33.91%)
因为机器学习需要概率,我也尝试学了一下,各种公式真的头大。继续努力吧。