百度面试题-汽水选择问题
本文介绍了百度面试题-汽水选择问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在炎炎夏日,你十分口渴,想要买一瓶冰汽水,商店中有三瓶汽水供你选择(如ABC),其中只有一瓶是冰过的。当你选定了其中的某一瓶后(设为A),店员摸了下剩余两瓶中的一瓶(设为B),并告诉你B不是冰的,此时你会将你的选择变更为剩余的那瓶嘛(C)?请详述你的理由?
电话面试的面试题,大致意思如下,请问这种问题该如何思考。
解决方案
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。
这篇关于百度面试题-汽水选择问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文