三門問題來源于一個(gè)娛樂節(jié)目。節(jié)目中有一位參與者和一位主持人,在參與者的面前有三扇關(guān)閉的門,其中兩扇門的后面是空的,剩下一扇門后是一輛法拉利跑車。當(dāng)參賽者選定了一扇門,但未去開啟它的時(shí)候,節(jié)目主持人開啟剩下兩扇門的其中一扇,是空門。主持人其后會(huì)問參賽者要不要換另一扇仍然關(guān)上的門。
本質(zhì)問題是換另一扇門會(huì)否增加參賽者贏得汽車的機(jī)會(huì)率?網(wǎng)上統(tǒng)一的答案是“會(huì)”,但是我發(fā)現(xiàn)有一個(gè)很重要的一點(diǎn)都被網(wǎng)上的文章忽略了,主持人他知道中獎(jiǎng)的門嗎?
一、代碼驗(yàn)證
此處列舉一個(gè)網(wǎng)上的 Java 代碼驗(yàn)證問題的實(shí)例:
import java.util.Random;
public class Test {
public static void main(String[] args) {
// 測試次數(shù)
int n = 10000;
//換門的獲獎(jiǎng)總次數(shù)
int changeWinCount = 0;
//不換門的獲獎(jiǎng)總次數(shù)
int unChangeWinCount = 0;
Random random = new Random();
for (int i = 0; i < n; i++) {
// 獲獎(jiǎng)的門
int bonusDoor = random.nextInt(3);
// 選中的門
int selectedDoor = random.nextInt(3);
// 如果選中的門就是獲獎(jiǎng)的門,那么不換門得獎(jiǎng),反之換門可以得獎(jiǎng)
if (selectedDoor == bonusDoor) {
unChangeWinCount++;
} else {
changeWinCount++;
}
}
System.out.println("不換門獲獎(jiǎng)總次數(shù):" + unChangeWinCount + ",比例:" + (float) unChangeWinCount / (changeWinCount + unChangeWinCount));
System.out.println("換門獲獎(jiǎng)總次數(shù):" + changeWinCount + ",比例:" + (float) changeWinCount / (changeWinCount + unChangeWinCount));
}
}
這個(gè)程序的運(yùn)行輸出大致為:
不換門獲獎(jiǎng)總次數(shù):3336,比例:0.3336
換門獲獎(jiǎng)總次數(shù):6664,比例:0.6664
根據(jù)這個(gè)結(jié)果,我們很容易就可以得出結(jié)論,不換門的獲獎(jiǎng)概率為 1/3
,換門的獲獎(jiǎng)概率為 2/3
。
但是事實(shí)是這樣嘛,在上面的案例中并沒有詳細(xì)的考慮到主持人開門的細(xì)節(jié)。
二、主持人是如何開門的?
在上面的案例代碼中僅判斷了選中的門是否是中獎(jiǎng)的門,稍微有些統(tǒng)計(jì)常識的同學(xué)都可以立即的出中獎(jiǎng)概率為 1/3
的結(jié)論。但是這個(gè)三門問題應(yīng)該還應(yīng)該更加細(xì)化的考慮一點(diǎn),主持人知道中獎(jiǎng)的門是哪個(gè)嗎?
- 主持人知道: 主持人知道中獎(jiǎng)的門,可以準(zhǔn)確的打開未中獎(jiǎng)的門,可以無須考慮主持人是否開門。
-
主持人不知道: 主持人不知道中獎(jiǎng)的門是哪個(gè),有一定的幾率打開的是中獎(jiǎng)的門,那么這局游戲應(yīng)該重開。而主持人打開中獎(jiǎng)的門的概率是
2/3 * 1/2 = 1/3
。
當(dāng)主持人不知道中獎(jiǎng)門時(shí)的驗(yàn)證代碼:
import java.util.*;
public class Test {
public static void main(String[] args) {
// 測試次數(shù)
int n = 10000;
//換門的獲獎(jiǎng)總次數(shù)
int changeWinCount = 0;
//不換門的獲獎(jiǎng)總次數(shù)
int unChangeWinCount = 0;
Random random = new Random();
for (int i = 0; i < n; i++) {
// 主持人可打開的門
List<Integer> doors = new ArrayList<>(Arrays.asList(0, 1, 2));
// 獲獎(jiǎng)的門
int bonusDoor = random.nextInt(3);
// 選中的門
int selectedDoor = random.nextInt(3);
// 選中的門不可打開
doors.remove(selectedDoor);
// 剩余的兩個(gè)門中主持人選中一個(gè)打開
int compereSelectedDoor = doors.get(random.nextInt(2));
// 如果主持人選中中獎(jiǎng)的門則作廢
if (compereSelectedDoor == bonusDoor) {
continue;
}
// 如果參與者選中的門就是獲獎(jiǎng)的門,那么不換門得獎(jiǎng),反之換門可以得獎(jiǎng)
if (selectedDoor == bonusDoor) {
unChangeWinCount++;
} else {
changeWinCount++;
}
}
System.out.println("不換門獲獎(jiǎng)總次數(shù):" + unChangeWinCount + ",比例:" + (float) unChangeWinCount / (changeWinCount + unChangeWinCount));
System.out.println("換門獲獎(jiǎng)總次數(shù):" + changeWinCount + ",比例:" + (float) changeWinCount / (changeWinCount + unChangeWinCount));
}
}
這個(gè)程序的運(yùn)行輸出大致為:
不換門獲獎(jiǎng)總次數(shù):3380,比例:0.5047036
換門獲獎(jiǎng)總次數(shù):3317,比例:0.4952964
通過以上結(jié)果可以看到,有 1/3
的局?jǐn)?shù)被作廢了,換門和不換門的獲獎(jiǎng)概率一致,都為 1/3
。
三、總結(jié)
這道題的重點(diǎn)就在于主持人選中中間門時(shí)的處理上,網(wǎng)上的代碼示例都未考慮到主持人有概率選到中獎(jiǎng)門這個(gè)情況?;蛘哒f都默認(rèn)主持人知道中獎(jiǎng)門,不會(huì)選錯(cuò)。于是未將主持人選中中間門的概率排除掉,并將這個(gè)概率合并到了換門獲獎(jiǎng)的概率中。所以有了 1/3
和 2/3
的這個(gè)中獎(jiǎng)率的差別。文章來源:http://www.zghlxwxcb.cn/news/detail-424528.html
PS:這個(gè)三門問題是在主持人知道中間門的前提下進(jìn)行的。本身這是一個(gè)很簡單的概率問題,只是一些文章作者沒有注意到這一點(diǎn),并沒有說明主持人知道中獎(jiǎng)門的前提,直接就說不換門和換門的中獎(jiǎng)概率是
1/3
和2/3
,這才導(dǎo)致了爭議。文章來源地址http://www.zghlxwxcb.cn/news/detail-424528.html
到了這里,關(guān)于對三門問題的思考,應(yīng)該細(xì)分兩種情況的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!