前言
大家都知道要想成為一名優(yōu)秀的開發(fā)工程師,需要數(shù)學(xué)基礎(chǔ)好,即你要有很強(qiáng)的邏輯思維能力,這里有一道美國(guó)斯坦福大學(xué)出的一道邏輯思維的測(cè)試題,檢測(cè)你的邏輯思維能力,大家可以看看自己邏輯能力怎么樣。
題目
有一個(gè)抽獎(jiǎng)活動(dòng),有三扇門,一扇門后是汽車,另外兩扇后是山羊,你第一次選擇其中一扇門后,主持人,會(huì)打開另外兩扇門中的一個(gè)是山羊的門,然后,再次讓你做選擇,是堅(jiān)持第一次的選擇還是選擇換門,請(qǐng)問參加這次活動(dòng)抽中汽車的概率是多少?

下面有幾個(gè)選項(xiàng)供大家選擇
A .1/3
B.1/2
C.1/6
D.2/3
E. 5/6
答案
恭喜你選對(duì)了,你猜的沒錯(cuò),答案就是D,中將的概率是三分之二,這是一個(gè)簡(jiǎn)單的數(shù)學(xué)概率問題。
解析
首先這次抽獎(jiǎng)包含了兩次選擇,單獨(dú)把每次選擇分開來看,第一次中將的概率是1/3,第二次中將的概率是1/2,問題的關(guān)鍵是要把兩次選擇當(dāng)成一個(gè)過程去計(jì)算概率,還有一點(diǎn)值得注意的是,最終的結(jié)果是第二次選擇為準(zhǔn)的,也就是說,無論你第一次是否選擇對(duì)了小汽車,如果第二次,沒選中的話,也是沒用。下面我們列出第一次和第二次選擇的所有可能。
第一次 |
第二次 |
山羊 |
山羊(不換們) |
山羊 |
汽車(換門) |
山羊 |
山羊(不換們) |
山羊 |
汽車(換門) |
汽車 |
山羊(換門) |
汽車 |
汽車(不換們) |
由上圖可以看出,第一次 所有可能出現(xiàn)的結(jié)果中,汽車出現(xiàn)了兩次,山羊出現(xiàn)了4次,第一次就抽中汽車的概率是1/3,第二次,由于主持人打開一扇門,幫我們排除了一個(gè)山羊選項(xiàng)。第二次所有的可能 汽車出現(xiàn)了3次,山羊出現(xiàn)了兩次,所有第二次選中汽車的概率是1/2。但是到這里,我們是統(tǒng)計(jì)了換門和不換們,一起的概率。假設(shè)我們第二次都選擇換門的話,出現(xiàn)的所有可能,就是下圖所示
第一次 |
第二次 |
山羊 |
汽車(換門) |
山羊 |
汽車(換門) |
汽車 |
山羊(換門) |
由上圖可以看出, 所有可能出現(xiàn)的結(jié)果中,汽車出現(xiàn)了兩次,山羊出現(xiàn)了一次,由此看見,只要我們,第一次和第二次選擇不同的門,即第二次選擇換門,我門的中將概率獎(jiǎng)達(dá)到最大2/3。
驗(yàn)證
下面用代碼模擬,人工選擇,操作一萬(wàn)次,看看統(tǒng)計(jì)中將次數(shù)占比,做驗(yàn)證。
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class MockDraw {
public static void main(String[] args) {
List<String> result=new ArrayList<>(10000);
for (int i = 0; i < 10000; i++) {
result.add(raffle());
}
Map<Object, Long> groupMap=result.stream().collect(Collectors.groupingBy(e->e,Collectors.counting()));
System.out.println(groupMap);
}
private static String raffle(){
//三個(gè)門的編號(hào)1,2,3
List<Integer> doors= Lists.newArrayList(1,2,3);
//獎(jiǎng)品選項(xiàng)
List<String> prizes= Lists.newArrayList("山羊","汽車","山羊");
//把獎(jiǎng)品隨機(jī)放到對(duì)應(yīng)的門后面
String option1=RandomUtil.randomEle(prizes);
prizes.remove(option1);
String option2=RandomUtil.randomEle(prizes);
prizes.remove(option2);
String option3=RandomUtil.randomEle(prizes);
prizes.remove(option3);
Map<Integer,String> map=new HashMap<>(5);
map.put(1,option1);
map.put(2,option2);
map.put(3,option3);
//第一次選擇
Integer firstSelect= RandomUtil.randomEle(doors);
//主持人打開一扇有羊的門
Integer open= openDoor(doors,map,firstSelect);
//排除打開門的選項(xiàng)
doors.remove(open);
//第二次選擇(換門)
Integer second= doors.stream().filter(e->!e.equals(firstSelect)).findFirst().get();
return map.get(second);
}
private static Integer openDoor(List<Integer> doors, Map<Integer,String> map,Integer firstSelect){
return doors.stream().filter(door->map.get(door).equals("山羊")&&!firstSelect.equals(door)).findFirst().get();
}
}
運(yùn)行結(jié)果:

模擬一萬(wàn)次,第二次選擇,每次都換門的情況下,最終選中山羊的次數(shù)是3322次,選中汽車的次數(shù)是6678次,中將概率接近2/3。
第二次不換門,修改代碼
//第二次選擇(不換門)
Integer second= doors.stream().filter(e->e.equals(firstSelect)).findFirst().get();
運(yùn)行結(jié)果:

模擬一萬(wàn)次,第二次選擇,每次都不換門的情況下,最終選中山羊的次數(shù)是6636次,選中汽車的次數(shù)是3364次,中將概率接近1/3。
模擬一萬(wàn)次,第二次隨機(jī)選擇會(huì)怎么樣
修改代碼:
//第二次選擇(隨機(jī))
Integer second= RandomUtil.randomEle(doors);
運(yùn)行結(jié)果

模擬一萬(wàn)次,第二次隨機(jī)選擇的情況下,最終選中山羊的次數(shù)是4926次,選中汽車的次數(shù)是5074次,中將概率接近1/2。文章來源:http://www.zghlxwxcb.cn/news/detail-816533.html
總結(jié)
這是一道經(jīng)典的概率題,所謂的概率只是個(gè)估值,只有在多次試驗(yàn)下,才有具有參考意義。文章來源地址http://www.zghlxwxcb.cn/news/detail-816533.html
到了這里,關(guān)于一道編程勸退題,檢測(cè)你是否適合干編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!