题目:
* 假设你参加电视节目,有三扇门供你选择,一扇门后边有奖品,其余两扇门后边无奖品。
* 主持人先让你做出一次选择,在你选择了一扇门之后打开一扇无奖品的门(主持人知道奖品在哪扇门后边)。
* 主持人给你一次选择的机会:是否更换你的选择?
出题者给出的答案:
三个门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:谁数学老师好,可以给我们讲讲前两种看起来说的过去,为什么是错的?