一个概率问题:开门夺宝


题目:

* 假设你参加电视节目,有三扇门供你选择,一扇门后边有奖品,其余两扇门后边无奖品。
* 主持人先让你做出一次选择,在你选择了一扇门之后打开一扇无奖品的门(主持人知道奖品在哪扇门后边)。
* 主持人给你一次选择的机会:是否更换你的选择?

 

出题者给出的答案:

三个门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是有奖品的。

  1. 当我们选择A的时候,主持人会翻开C,我们更换到B,中奖
  2. 当我们选择B的时候,主持人会翻开A或C,我们更换到任意一个,未中奖
  3. 当我们选择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:谁数学老师好,可以给我们讲讲前两种看起来说的过去,为什么是错的?


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注