- 三门问题的简介
- 如果是选择题呢?
- 一道单选题有ABC三个选项, 你不会做, 蒙了个C, 然后老师说, ‘A肯定是错的’, 那你应该选B还是C?
- 这个和三门问题是一样的, 但我们需要一些说明来防止出现歧义, 那就是‘你事先就知道, 你不管选哪个, 老师都会给你展示一个你的选择以外的错误答案’, 那么选C正确概率是1/3, 选B正确概率是2/3.
- 用我觉得最好理解的方式解答(当然还是很多方式可以解答): 你蒙到正确答案(概率)是1/3, 这时你换了肯定错, 不换肯定对; 你蒙到错误答案是2/3, 这时你换了肯定对, 不换肯定错. 加起来就是换了有2/3的概率对, 不换有1/3概率对.
- 我们知道三门问题拓展到三个以上的门的时候结论依然不变, 但当我们的选择题有多个选项的时候还是一样吗? 依然是老师总会给你一个你的选择以外的错误答案.
- 继续使用之前的方式, 你蒙到正确答案是1/4, 这时换肯定错, 不换肯定对; 你蒙到错误答案是3/4, 这时换到正确答案是1/2, 不换肯定错. 加起来就是换了有3/8的概率对, 不换有1/4概率对.
- 以此类推, 换了有((n-1)/n)*(1/(n-2))概率对, 不换有1/(n-1)的概率对, 所以换一个答案.
- 如何是在考试中呢?
- 在实际考试中, 老师并不是综艺节目主持人, 不大可能非要给你排除一个错误答案. 但我们可以假设当你面对一道不会做的选择题随便蒙了一个答案以后, 你突然灵光一闪发现另外一个答案肯定(100%)是错误的, 这是你应该另外蒙一个答案吗?
- 在labuladong 的算法小抄中作者给出了一个答案, '换啊!换了之后正确概率是 (1 - 1/4) / 2 = 3/8 啊!', 那可太好了, 概率论助我蒙对答案! 可是这是真的吗? 考试的时候遇到这种情况换了真的能有3/8的概率正确吗? 我想再求证一下.
- 而重点就是, 这种情况真的和三门问题一样吗? 三门问题的前提是, 有一个人(主持人或者上文的综艺主持人老师)知道真相. 无论你选哪个, TA都会给你一个"你的选择以外的错误答案".
- 为什么要强调"你的选择以外的"? 举个例子, 假设A,B都是错的, 你选了A, 老师会说B是错的, 你选择B, 老师不会给你说B是错的, 可能会说A是错的.
- 在考试情况下, 并没有这么一个人, 而你的信息是有限的, 你只知道某个特定的选项是错误的而已.
- 现在情况发生了变化: 你有1/4的概率选到正确答案, 然后你排除了一个肯定错误的答案, 这时换肯定错, 不换肯定对; 你有2/4的概率'选到错误答案并且稍后排除掉肯定错误的答案', 这时换到正确答案是1/2, 不换肯定错; 你还有1/4的概率'选到错误答案并且稍后发现这个答案肯定是错误的', 那你肯定要换一个蒙, 对的概率是1/3. 而我们设想的情景是只包括前两个情况的, 也就是说, 当你遇到这个抉择的时候, 最后那1/4概率的情况是不会发生的. 因此你有了1/3的概率选到正确答案(因为你并没有选你觉得肯定错误的那个选项), 这时换肯定错, 不换肯定对; 你也有了2/3的概率'选到错误答案并且稍候排除掉肯定错误的答案', 这时换到正确答案是1/2, 不换肯定错. 加起来就变成了换了有(2/3)*(1/2)=1/3概率对, 不换也有1/3的概率对.
- 因此在上文的考试情景中, 换不换没区别, 既然你只排除了一个错误答案, 那么不管你怎么蒙, 蒙对的概率依然是只有1/3. 'No free lunch'.
- (2021-10-07更新) 再来回顾一下为什么之前的三门问题不是'No free lunch'. 重点就在于主持人给你加入了额外信息: "你的选择以外的错误答案". 如果你初次选择的是正确答案, 那么主持人仅需知道一个错误答案就能回复你, 但是如果你初次选择的是错误答案, 那么主持人必须知道另一个的错误答案是哪个才能给你回复. 而主持人需要根据知道的两个错误答案给你的回复(当你初次选择到错误信息时)便是额外的信息.
- 是真的吗, 我苦学概率论对考试蒙选择题真的就一点用也没有吗? 那就用'计算机模拟实验'来让你彻底死心吧.
- 计算机模拟实验, python代码如下
import random
import pandas
df = pandas.DataFrame()
# counts
total = 0
no_change_correct = 0
change_correct = 0
for i in range(1000000):
# one answer is true answer
rand_true = random.randint(0, 3)
# you find only one wrong answer
temp = set([0, 1, 2, 3])
temp.remove(rand_true)
rand_must_false = list(temp)[random.randint(0, 2)]
# you random choose a answer (before you find one wrong answer)
temp = set([0, 1, 2, 3])
temp.remove(rand_must_false)
rand_guess = list(temp)[random.randint(0, 2)]
# random choose a new answer
temp = set([0, 1, 2, 3])
temp.remove(rand_guess)
temp.remove(rand_must_false)
rand_new_guess = list(temp)[random.randint(0, 1)]
# update counts
total = total + 1
no_change_correct = no_change_correct + (rand_true == rand_guess)
change_correct = change_correct + (rand_true == rand_new_guess)
# result
prob_no_change = no_change_correct/total
prob_change = change_correct/total
# print
print("if no change the prob. of correct is")
print(prob_no_change)
print("if change the prob. of correct is")
print(prob_change)
if no change the prob. of correct is
0.333599
if change the prob. of correct is
0.333584