百度面试题-汽水选择问题

在炎炎夏日,你十分口渴,想要买一瓶冰汽水,商店中有三瓶汽水供你选择(如ABC),其中只有一瓶是冰过的。当你选定了其中的某一瓶后(设为A),店员摸了下剩余两瓶中的一瓶(设为B),并告诉你B不是冰的,此时你会将你的选择变更为剩余的那瓶嘛(C)?请详述你的理由?

电话面试的面试题,大致意思如下,请问这种问题该如何思考。

阅读 23.2k
41 个回答

9月9日更新一段Python代码,来验证三门问题换和不换的具体概率,实验进行1000轮,具体方案见代码注释。

白天可能由于网络缘故,代码一直提交不上,现已更新。

# coding=utf-8
# Name: 三门问题概率实验
# Author: X_AirDu
# Python Version: 2.7.9
# Describe: 实验前提为售货员说实话

import random

# 种子为0, 0, 1,其中1为正确答案(即冰汽水)
seed = [0, 0, 1]
# 存放问题的容器,目的为统计概率,基本结构为[[0, 0, 1], [1, 0, 0]...]
holder = []
# 容器总量
total = 0

def init():
    '''以seed为种子随机生成1000个问题并存于容器中'''
    for i in range(1000):
        holder.append(random.sample(seed, 3))
    global total
    total = float(len(holder))
    
def change():
    correct = 0.    # 选择正确的次数
    choose_num = 0    # 本回合选择的序号
    choose = 0    # 本回合的选择
    # 遍历容器,得到每个问题[0或1, 0或1, 0或1]列表
    for each in holder:
        # 随机生成0, 1, 2作为本回合选择想,分别对应第0瓶汽水,第1瓶汽水,第2瓶汽水
        choose_num = random.randint(0, 2)
        # 遍历问题,j为门(汽水)的下标,gate为具体门的值0或1(0非冰,1冰汽水)
        for gate in each:
            # 已选择的忽略
            if j == choose_num:
                continue
            '''
            下面解释一下:
            如果 gate == 0,非冰,相当于售货员告诉你“非冰”
            然后 continue,选择剩下的最后一瓶
            
            如果 gate != 0,冰,相当于售货员告诉你剩下的最后一瓶是“非冰”
            直接选择当前 gate
            '''
            if not gate:
                continue
            choose = gate
            if choose:
                correct += 1
    print '换之后正确的概率为:{0}%.'.format(correct/total * 100)

def not_change():
    correct = 0.
    choose_num = 0
    for each in holder:
        choose_num = random.randint(0, 2)
        for j, gate in enumerate(each):
            '''
            无论如何都不换
            '''
            if j == choose_num:
                if gate:
                    correct += 1
                    break
    print '不换时正确的概率为:{0}%.'.format(correct/total * 100)
    
if __name__ == '__main__':
    init()
    change()
    not_change()

输出结果:

换之后正确的概率为:67.9%.
不换时正确的概率为:31.3%.

如果把问题数增加到足够大,譬如1000,000次,则最终结果无限接近2/3和1/3。

各位有Python条件的可以用此代码自行验证。

==============================分割线===================================
原答案:

三门问题,一定要换。

原本三瓶中冰的概率均为1/3:

A: 1/3
B: 1/3
C: 1/3

假设我们可以选两瓶,那么我们拿到冰的概率就变成了2/3。

而此时售货员得到冰的概率就是2/3,因为我们选择了A,他还有两瓶B和C。

也就是说,B和C中,有任意一瓶是冰的概率为2/3,然后售货员帮我们排除了一个不是冰的B,但因为B和C中有冰的概率为2/3,因此当B这个错误答案被排除后,C就相当于之前B和C的整体,因此,C是冰的概率为2/3。

和三门问题不一样
三门问题主持人打开门时,一切都是透明可见的
然而,这个问题中,店员摸了饮料,只有店员知道是不是冰的

也就是说:店员可以撒谎!

这就不只是数学问题了

首先答案不论你换不换,你拿到冰的概率都是50%

这是一个简单的概率问题。其实高中的时候学的概率就可以解决。
先引用高中的一个简单概率题,就是说你不论买彩票还是抽奖,买彩票或者抽奖的次序都不会影响到你获奖的概率。因为大家中奖的概率都是相同的。

然后回到这个问题上来,
http://www.guokr.com/post/9314/
我看了一下第一个解释说是换了会2/3的

有三种可能的情况,全部都有相等的可能性(1/3):

  参赛者挑山羊一号,主持人挑山羊二号。转换将赢得汽车。 参赛者挑山羊二号,主持人挑山羊一号。转换将赢得汽车。
参赛者挑汽车,主持人挑两头山羊的任何一头。转换将失败。 在头两种情况,参赛者可以透过转换选择而赢得汽车

这里说三种可能就是错的,第三种情况,这里只写了参赛者挑汽车,主持人挑两头中的任何一头。这里是不严谨的。应该有第三和第四,分别是主持人条了山羊A和山羊B。

首先主持人确定是羊,这是前提条件,然后如下
A代表羊A B代表羊B C代表车
情况如下

主持人 另外 换之前 换之后
A B C ×
B A C ×
C A B ×
C B A ×

那么换之前换之后其实我的概率都是50%。
解答完毕。

我说一下我想到的点吧,不知道你应聘什么岗位呀?
我觉得作为被面试者可以大胆地质疑问题,让他解释问题的时候你就多了思考的时间,他也可以看出你思维的严谨程度,也给考官留下印象(当然问题不要太偏)。比如你可以问他:第一要看我当时想喝冰的还是不冰的?如果我想喝冰的,那再问:说我选定了是指已经拿到手了吗?如果拿到手了那就:自己手里的冰就不换手里的不冰就换啦。如果店员没有帮我拿到手里,那就问店员可不可以帮我拿那瓶冰的,对他来说也不麻烦。我觉得你可以列出能想到的各种情况,因为这个题本身非常生活化,甚至可以给他讲个故事,总之怎么体现你的特色,让人印象深刻就好。
我认为他是想考你面对种种条件设置是否会产生思维定式。

好吧, 确实是三门问题. 写了代码验证, 不换 赢的概率1/3, 换的话是2/3

Java代码如下:

@Test
public void threeDoor() {
    int totalRun = 1_000_000, succCountNoChange = 0, succCountChange = 0;
    boolean bottles[] = new boolean[3];
    Random r = new Random(), r1 = new Random();
    
    for (int i = 0; i < totalRun; i++) {
        // 三瓶随机放一瓶冰的
        Arrays.fill(bottles, false);
        bottles[r.nextInt(3)] = true;
        
        // 我随机选一个
        int mePick = r1.nextInt(3), shePick = 0, left = 0;
        // 店员从剩下两个选一个不冰的
        while (bottles[shePick] || shePick == mePick) 
            shePick++;
        // 挑剩下的
        while (left == shePick || left == mePick) 
            left++;
        
        if (bottles[mePick]) // 不换
            succCountNoChange++;
        if (bottles[left])   // 换了
            succCountChange++;
    }
    System.out.println("换: "+ (float)succCountChange / totalRun);
    System.out.println("不换: "+ (float)succCountNoChange / totalRun);
}    

结论是:

换: 0.66556
不换: 0.33444

以下作废

我觉得 在 "店员告诉你B不是冰的" 之后, 这个问题转变为 从两瓶里(一瓶冰 一瓶不冰), 选出冰的. 所以换不换一样.

更新

我就没考虑 店员 会使诈. 这个黑暗的社会啊, 小朋友都被带坏了.

假如店员说实话, 那么有四种情况:

店员    我  
不冰1   不冰2   冰
不冰1   冰      不冰2
不冰2   不冰1   冰
不冰2   冰      不冰1

所以对我来说, 换不换一样.

感觉这个就是概率反转的问题吧。 第一次 选择不冰的概率是 2/3,冰的概率是1/3. 如果选择变更,冰的概率就变成2/3。所以选择换了

我看完这第一想法啊,可能不对,各位大神轻拍,既然我已经选择了A,那我不就知道A是不是冰的了嘛,然后直接选择C不就好了嘛。当然我也看了那个果壳上说的,那个是选择之后不告诉你里边是不是汽车,但是具体化到买饮料这事,难道不应该是我直接用手拿起来A嘛……

这个是有标准答案的,就是三门问题,当然要换。

这个问题简单的回答就是 换 因为店员帮你排除了一个错误选项, 使 c 为冰的概率增加到了 2/3 。这个问题在 赤裸裸的统计学 第6章 蒙提·霍尔悖论 有详细解释

我觉得这是一个理性和感性的问题:
从理性角度来讲 换,因为我要喝冰的 有2/3的概率是冰的 楼上很多都回答了这个问题
从感性角度来讲 既然我已经选择了A了,就该付钱走人了,那姐姐为什么还要摸一下才知道哪个是冰的,明明应该可以直接看出来,感觉好奇怪,难道有诈,还是赶紧还给他说不要了吧,说不定这不是汽水 是什么水呢。 跑吧,少年。

我怎么感觉这题跟电影决胜二十一点的三扇门的选择问题这么像呢?题主可以去看看决胜二十一点

三门问题:
首先抛开面试,先回答这个问题:
不抠字眼:
ABC三个只有一个是冰的,那么你选择A的正确率是1/3。店员告诉你B不是冰的,那么你的选择变成AC,选A的正确几率是1/2。
现在开始抠字眼:店员摸了下剩余两瓶中的一瓶
这意味着店员不知道C是否是冰的,你的选择变成AC,选A的正确几率是1/2。
(如果店员把剩余两瓶都摸了,或者在你来之前他就知道哪瓶是冰的,那他就知道C有可能是冰的,也有可能不是,这就是另一性质的问题了:他想让你买走冰的,或者他不想让你买走冰的。这种情况概率会变化)

至于其他答案说能算出2/3概率,我没理解怎么算出来的。

现在回到面试。因为没说是面的什么职位,所以这题可能是算法题,也可能是人际关系题,也有可能是面试官故意难为你,也有可能是面试官只是拿着个网上百度出来的标准答案衡量你。
如果店员可靠(只摸了B瓶并且告诉你B不是冰的)
如果是开发相关,就是前面说的1/3变1/2,你选A或者选C都一样。
如果是其他方向的,你要考虑店员是不是可信的。(比如测试岗位,开发说没问题,你要怎么做。这题并没有说你选了C之后发现C不是冰的你不能变回A,因为你就是想要冰的(完成产品需求))

如果店员不可靠(只摸了B瓶并且告诉你B不是冰的)
这题有可能就变成支持问题了,客户说的并没有表达完全,为何客户只摸B不摸C,为何客户只说B是冰的。

当然我觉得,面试考察的并不是你选A还是选C,而是为了考验应试者对自己观点的阐述能力。
当然如果面试官只是拿着个网上百度出来的标准答案衡量而已。这只是个猜答案的游戏而已。

楼上果壳网最后的黑体是正解吧~
是三门问题的前提是店员知道哪一瓶是冰的(腹黑店员(-.-)),然后告诉你B不是冰的,这种情况下就选择换了

否则概率一样,不换不用后悔哈哈

如果是我的话,我只会用常识回答。
我会直接回答:冷饮伤身,我就是想喝不冰的,直接换店员那瓶不冰的(B),完了,谢谢。

如果对方继续问,假设你想喝冰的,你会怎么办?
答: 不冰的,和冰的,在外观上是可以分辨出来的(如水珠),那么从A或C的外观看,挑外观看起来冰的。

如果对方继续问,假设外观及其他都无论分辨,你会换吗?
答: 不换。因为找不到换的理由,在没有更清晰的指导思路时,先尝试当下的选择。

思路一定要清晰,肯定,表达清楚,简洁。不要啰里啰索,思路跳跃,让人不知所云。面试官出问题,最重要的就是看你这些,问题的具体答案往往并不重要。

不知道是不是技术岗
(1)是技术岗的话,基本确定是考你三门问题。

(2)不是技术岗,如果你完全不知道三门问题,可以通过观察来判断:你拿到A,正常情况下可以通过手感判断A是否符合你对冰的要求(或通过汽水外围雾气等经验判断),而决定是否要A;其次你可以看到C的情况通过外观来判断C是否比A更冰,从而根据自己的需要选择。

反正目的都是要体现你自己观察、分析和解决问题的能力。

PS:上面有些回答问题的,看清楚题目再回答:你十分口渴,想要买一瓶汽水。还去讨论要不要冰的?

三门问题。

  1. 你拿不冰水、店员拿不冰水的概率1/3.

  2. 你拿不冰水、店员拿 冰水的概率1/3.

  3. 你拿 冰水、店员拿不冰水的概率1/3.

已经知道店员拿不冰水,则在1、3两种情况下选择。
概率相等,换不换一样。


这种问题就算在电话里答得不完全给出方法足够了。
而且口述的话不会有太多隐藏含义,正常表现。

在第一次选择的时候,拿到冰水的概率是1/3;
如果没有换,拿到冰水的概率还是1/3,但是换了的话,拿到冰水的概率就变成了两个中的一个,也就是1/2,概率提高了。要换。


这其实是概率学的问题,没有任何深入思考的价值。也不必去怀疑这个概率的可靠性。

新手上路,请多包涵

很明显,把汽水映射成工作了,要看你是怎么对待这份工作的,从你的回答中,检测你对工作是随便选的,还是认认真真做出的选择,只要你最后能够确定选到冰水,怎么回答都可以

三门问题什么的我有点想不通……
明明就是一对两错,固定排除掉一错,变成一对一错……然后一对一错之间选一个。
概率怎么变成2/3了……!

-------2015/9/9-------
是我想错了。
第一次选择的时候,主持人选择到一对一错的概率是2/3,两错的概率是1/3。
然后一对一错被主持人排除掉一错,就变成了一对……
这样一想,当然是换了更赚。

@52coder
首先,先进行问题限定:
前提1:
假定店员不会撒谎。
前提2:(引起歧义的地方主要在这里)
由于店员摸了剩余的两瓶,因此,此时店员是知道答案的。
由于三瓶的汽水是不是冰的所有可能为:冰|不冰|不冰、不冰|冰|不冰、不冰|不冰|冰,因此,不论你选择的是哪个,店员都至少会摸到一个不冰的。而店员此时告诉你的是不冰的。
那么有两种可能:

  1. 不论店员摸到的两个分别是什么,都会告诉你他摸到的第一个的瓶子的情况

  2. 不论店员摸到的两个是什么,都会告诉你那个不冰的情况

第一种情况下,模型仍然是满足等概率的,店员告诉你其中一个瓶子的情况,相当于在三种可能中排除了一种,
因此,此时,不换会赢的概率就是1/2。
这也是最符合直觉的一种,因为我们总是假设店员的行为也是随机的

第二种情况下,由于不论店员摸到的情况是什么,他总是会告诉你那个不冰的瓶子,所以,此时模型发生了变化,不再是等概率模型。
此时,不换会赢的概率就变成了,店员在三瓶中选择两瓶都是不冰的概率,很显然是1/3。
由于不换要么赢,那么不赢,所以,不换会输的概率就是2/3,也就是换会赢的概率是2/3。
这种情况下,选择换,赢的概率比较大。

换不换都一样,之前选择的概率是1/3,而在店员告诉你哪瓶是不冰的时候虽然概率变成了1/2,但是命题还是一样的,就好比做选择题的时候已经告诉了你一个答案是错误的,对本身的结果并不会有影响,换句话说,当店员告诉你B是不冰的时候,当初的概率已经变成了1/2,相当于命题已经换掉了。

那如果店员告诉你他手上那个是冰的,你还用考虑要不要换吗?

对于三门问题即:如果店员前提是知道哪个是冰的,故意指向不冰的,那肯定是要换的.

对于本题,大概不是经典的三门问题,应该是换与不换都是一样的。

新手上路,请多包涵

不考虑腹黑和其他歪理,从纯概率考虑,还是和三门不一样的。

三门的关键在于,门对主持人不是等价的,主持人永远不会打开有东西的那个门。因而自己选中的门和主持人挑剩下的门是不等概率的。

而这题店员是挑完以后才知道结果的,水对店员来说也是等概率的。

新手上路,请多包涵

我的分析是,如果店员不撒谎的话(当然没有店员这么无聊),他既然又去摸B说不是凉的,那么手里的A肯定也不是凉的,因为是凉的他就不摸了,所以要换C,C是凉的

新手上路,请多包涵

我觉得是1/2概率嘛。。换不换都一样。但是我会这么回答: 先看哪个瓶子上有水汽啊!一看就知道了。又不是黑箱。然后再告诉他50%。

新手上路,请多包涵

高三老师给我们讲过这个问题,换的话成功的概率是2/3,不换的话成功的概率是1/3。

网上很多答案说是2/3并且得到了很多人支持,理由是:
你选A的时候,A为冰的概率是1/3,剩下的B+C概率是:2/3,目前店员打开的B是不冰,剩下的C的概率就是2/3,所以应该换。

下面我们换个角度来思考一下:
首先我们说的抓阄:无论先抓后抓,谁都不能肯定自己的结果,所以抓阄是先抓后抓概率都是一样的,也就是公平的。
那么我们把题目变通一下:假设你选了A,店员选了B,剩下的C归老板。每个人的概率都是1/3,店员打开了是不冰的并不影响你和老板手里的概率。那么你的和老板的都随着店员瓶子的打开概率各自变成了1/2。
所以换不换都一样。

我觉得三门问题的关键在于,主持人事先知不知道哪个门后面有奖品.
也就是说主持人打开一个空门是不是故意的,
如果是故意的,那么不换的概率不变,为1/3,但是换的话就相当于从两个门里面选一个有奖品的,获奖率上升为1/2.
如果主持人也是随机打开一个门,那么换不换概率都是1/3.

看了一些撤三门的感觉有点蛋疼

最开始的时候概率是1/3这没错,概率在过程中确实改变了,但是与换不换没有关系,只与老板告诉的信息有关,老板透露信息之后AC的概率都变成1/2,而不是什么2/3

这就好比你买彩票,开奖之前你的中奖概率可能是1/100000,开奖之后你中奖了概率就是1,没中奖概率就是0

我是按题主给出的内容作出的这样分析,我怀疑题主给出的信息不够全面

最新看法,我也不知道怎么解释这种情况。
三门问题,这么来看:
第二次我随机选择一个主持人没有选择的门,那么赢得几率是50%。
但是!!!
在我多次测试的结果下,在赢的次数中,选择换然后赢和选择不换然后赢的次数比是2:1
这是为什么呢?为什么呢?为什么呢?

public static void main(String[] args) {
        //三个门,true表示有东西
        boolean[] door = new boolean[3];
        
        Random random = new Random(47);
        int all = 10000;
        int win = 0;
        int noChange = 0;
        int noChangeWin = 0;
        int changeWin = 0;
        
        
        for(int j = 0; j<10000; j++)
        {
            int t = random.nextInt(3);
            for(int i=0 ; i< 3; i++)
            {
                if (t == i) {
                    door[i] = true;
                }else{
                    door[i] = false;
                }
            }
            int myChoice = random.nextInt(3);
            //主持人选择一个没有true且不是选手所选的门。
            int zhuchirenChroice = 0;
            for(zhuchirenChroice=0; zhuchirenChroice<3; zhuchirenChroice++)
            {
                if(zhuchirenChroice!=t && zhuchirenChroice!=myChoice)
                {
                    //System.out.println("主持人选择"+zhuchirenChroice);
                    break;
                }
            }
            //选手重新随机选择
            int myNewChoice = random.nextInt(2);
            if(zhuchirenChroice == 0)
            {
                myNewChoice++;
            }else if(zhuchirenChroice == 1){
                if(myNewChoice ==1)
                {
                    myNewChoice++;
                }
            }
//            while (myNewChoice == zhuchirenChroice) {
//                myNewChoice = random.nextInt(3);
//            }
            
            if (door[myNewChoice]) {
                win++;
                if(myChoice == myNewChoice)
                {
                    noChangeWin++;
                }else {
                    changeWin++;
                }
            }
            if (myChoice == myNewChoice) {
                noChange++;
            }
        }
        System.out.println("赢的几率:"+((double)win/(double)all));
        System.out.println("没有改变的几率:"+(((double)noChange/(double)all)));
        System.out.println("没有改变赢的几率:"+(((double)noChangeWin/(double)all)));
        System.out.println("改变赢的几率:"+(((double)changeWin/(double)all)));
        
        
    }

结果是:
赢的几率:0.4961
没有改变的几率:0.4897
没有改变赢的几率:0.1565
改变赢的几率:0.3396

三门问题 要换 推导挺复杂的 说实话我觉得没看过三门问题的人是基本答不上来的 要知道80年代的时候这个问题很多数学家一开始都没答上来呢, 更别说只有几分钟考虑的码农了

但这个问题流传的还算广泛 等于有一些人看过有些人没看过 这个问题一点也不fair 由此看出百度和Google 在招聘上差距不小

感觉概率是一样的 说不定面试官就只是想看看你怎么选 有什么理由而已

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏