题目:
* 假设你参加电视节目,有三扇门供你选择,一扇门后边有奖品,其余两扇门后边无奖品。
* 主持人先让你做出一次选择,在你选择了一扇门之后打开一扇无奖品的门(主持人知道奖品在哪扇门后边)。
* 主持人给你一次选择的机会:是否更换你的选择?
出题者给出的答案:
三个门A B C,你做第一次选择时选A概率P(A) = 1/3,那就是放弃了选择B或C 即P(B或C)=P(B) + P(C) = 1/3 + 1/3 = 2/3,此时主持人明确告诉你了P(C)=0,那么P(B)=2/3,概率是P(A)的两倍,你还不换?
我数学不好,你可别骗我。。。
再看看我同事给出的一个答案:
三个门A B C ,假设其中B是有奖品的。
- 当我们选择A的时候,主持人会翻开C,我们更换到B,中奖
- 当我们选择B的时候,主持人会翻开A或C,我们更换到任意一个,未中奖
- 当我们选择C的时候,主持人会翻开A,我们更换到B,中奖
结论就是,中奖的概率2/3。
我惊呆了,让人信服。。。
但我的想法我觉得也是对的。。。
首次选择的时候,有三扇门,我选择任意一个,中奖概率1/3。
当主持人打开一扇无奖品的门时,再次选择是从两扇门中选择,中奖概率1/2。
那么究竟哪个答案才是正确的呢?
我写了段程序,验证了下:
<?php
/**
* 假设你参加电视节目,有三扇门供你选择,一扇门后边有奖品,其余两扇门后边无奖品。
* 主持人先让你做出一次选择,在你选择了一扇门之后打开一扇无奖品的门(主持人知道奖品在哪扇门后边)。
* 主持人给你一次选择的机会:是否更换你的选择?
*
* 此程序通过运行N次,计算更换与否的概率
*
* @example
* lucky(false, true); // 不更换选择,并打印过程
* lucky(true, true); // 更换选择,并打印过程
*
* 结果可能如下:
doors:1,2,3
choice:1
lucky door:1
bad lucky doors:2,3
open door:3
left door:2
lucky? Yes
doors:1,2,3
choice:2
lucky door:3
bad lucky doors:1,2
open door:1
left door:3
change door:3
lucky? Yes
*/
// 随机进行100万次
$totalTimes = 1000000;
// 获得奖品的次数
$luckyTimes = 0;
// 不更换选择
for ($i = 0; $i < $totalTimes; ++$i){
if (lucky(false)){
++$luckyTimes;
}
}
// total times:1000000
// lucky times:333073
// probability:0.33
// 随机进行100万次
$totalTimes = 1000000;
// 获得奖品的次数
$luckyTimes = 0;
// 更换选择
for ($i = 0; $i < $totalTimes; ++$i){
if (lucky(true)){
++$luckyTimes;
}
}
// total times:1000000
// lucky times:499659
// probability:0.50
echo 'total times:', $totalTimes, PHP_EOL;
echo 'lucky times:', $luckyTimes, PHP_EOL;
echo 'probability:', number_format($luckyTimes / $totalTimes, 2), PHP_EOL;
function lucky($change = false, $verbose = false){
// 共有几扇门
$doors = [1,2,3];
$verbose && print('doors:' . implode(',', $doors) . PHP_EOL);
// 嘉宾选择的门
$choice = $doors[array_rand($doors)];
$verbose && print('choice:' . $choice . PHP_EOL);
// 随机其中一个门是有奖品的门
$luckyDoor = $doors[array_rand($doors)];
$verbose && print('lucky door:' . $luckyDoor . PHP_EOL);
// 无奖品的门
$badLuckyDoors = array_diff($doors, [$luckyDoor]);
$verbose && print('bad lucky doors:' . implode(',', $badLuckyDoors) . PHP_EOL);
// 主持人翻开其中一个无奖品的门
$openBadLuckyDoor = $badLuckyDoors[array_rand($badLuckyDoors)];
$verbose && print('open door:' . $openBadLuckyDoor . PHP_EOL);
// 不包括嘉宾选择的门,剩下的关闭着的门
$leftDoors = array_diff($doors, [$openBadLuckyDoor, $choice]);
$verbose && print('left door:' . implode(',', $leftDoors) . PHP_EOL);
// 如果嘉宾更换选择
if ($change){
$choice = $leftDoors[array_rand($leftDoors)];
$verbose && print('change door:' . $choice . PHP_EOL);
}
$verbose && print('lucky? ' . ($luckyDoor == $choice ? 'Yes' : 'No') . PHP_EOL . PHP_EOL);
return $luckyDoor == $choice;
}
不难看出,不更换选择,概率是1/3,更换选择,概率是1/2。。。
Ps:谁数学老师好,可以给我们讲讲前两种看起来说的过去,为什么是错的?