鱼C论坛

 找回密码
 立即注册
查看: 800|回复: 17

[技术交流] 三门问题

[复制链接]
发表于 2023-7-9 14:58:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 陈尚涵 于 2023-8-3 15:02 编辑

三门问题:你面前有三扇门,其中一扇门是汽车,另外两扇门是山羊,你选择一扇门,接下来你知道除你选择的门之外有一扇门里有山羊,此时你可以决定是否选择除自己之前选择的门和已知的里面有山羊的门之外的门(剩下的门),应不应该选择这扇门呢?(也就是剩下的门里有汽车的概率有没有选择之前选择的一扇门的概率高)
举个例子,有三扇门, 你选择了第一扇门,这时你知道了第二扇门(也就是除了第一扇门(你开始选择的门)之外的任意一扇门)里是个山羊,你还可以选择第三扇门(也就是除了第一扇门(你开始选择的门)和你已知的有山羊的门(第二扇门)之外的门,简单来说就是剩下的门)那么此时你应不应该选择第三扇门呢?(也就是第三扇门里有汽车的概率有没有选择第一扇门的概率高)
那么到底是否应该选择剩下的门呢?那么我告诉你,是2/3(三分之二)的概率。你先别急着反驳,我给你讲讲为什么。
在刚开始我选择一扇门的时候,这扇门为汽车的概率为1/3,那么除我选择的门之外的门有汽车的概率,即我选择的门不为汽车的概率,为2/3,那么在这2/3的概率中,除我选择的门之外的门中一扇是山羊,一扇是汽车,在1/3的概率中除我选择的门之外的门都是山羊,那么你知道了除你选择的门之外的门中的一扇是山羊,在那2/3的概率中剩下的门就是汽车,在1/3的概率中剩下的门就是山羊,即剩下的门为汽车的概率是2/3。
这边也可以参考@zhangjinxuan 的证明方法:一开始,如果我们选择一个后面是羊的门,那么我们就会知道另一个有羊的门,此时两个羊都被排除,选剩下的门一定得到车,而这种一开始选到羊的概率是 2/3。如果我们一开始选择有车的门,那么,剩下的门总是会是羊,这种一开始选到车概率是1/3。
如果你还是不信剩下的门为汽车的概率是2/3,毕竟是学编程的,写个程序证明一下不就行了?(通过模拟题目,输出一千万次剩下的门为汽车的次数)
图一时之快先看答案,你将失去一次锻炼的机会!
请先自己思考和动手,再回复查看参考答案。
直接完全按照题目写,可得3鱼币3荣誉1贡献
也可以优化一下,可得5鱼币5荣誉3贡献
游客,如果您要查看本帖隐藏内容请回复
[/hide]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-7-9 15:06:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:11:39 | 显示全部楼层
我的理解是,你不更改选择的话,那么你选择的物品不会变化,所以对应的概率就不会变,还是原本的 1/3。

什么乱七八糟的证明

或者我们可以列出所有的情况来考虑,那就算了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 15:16:19 | 显示全部楼层
zhangjinxuan 发表于 2023-7-9 15:11
我的理解是,你不更改选择的话,那么你选择的物品不会变化,所以对应的概率就不会变,还是原本的 1/3。

...

你这个证明很容易就会被推翻的,比如山羊没了,然后就剩两扇有可能存在汽车的门,那就是1/2了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 15:17:00 | 显示全部楼层
zhangjinxuan 发表于 2023-7-9 15:11
我的理解是,你不更改选择的话,那么你选择的物品不会变化,所以对应的概率就不会变,还是原本的 1/3。

...

我这个证明你只要看懂了,那么你是很难推翻他的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:26:30 | 显示全部楼层
陈尚涵 发表于 2023-7-9 15:17
我这个证明你只要看懂了,那么你是很难推翻他的


我悟了一点。

就是一开始,如果我们选择一个后面是羊的门,那么主持人只能选择另一个有羊的门,此时两个羊都被排除,更换一定得到车,而这种一开始选到羊的概率是 2/3。

如果我们一开始选择有车的门,那么无论怎么更换,我们总是会选到羊,这种概率是 1/3。

所以,如果我们在主持人开门后总是更换,会有 2/3 的概率得到的大奖。

证完了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 15:29:04 | 显示全部楼层
zhangjinxuan 发表于 2023-7-9 15:26
我悟了一点。

就是一开始,如果我们选择一个后面是羊的门,那么主持人只能选择另一个有羊的门,此时 ...

正确,和我的思路一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:29:52 | 显示全部楼层
陈尚涵 发表于 2023-7-9 15:29
正确,和我的思路一样

至于程序,dfs 他不香吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 15:35:47 | 显示全部楼层
zhangjinxuan 发表于 2023-7-9 15:29
至于程序,dfs 他不香吗

可能我没说清楚,这个程序是用通过模拟题目,输出一千万次剩下的门为汽车的次数
你这个不用程序,用数学不就行了,确定你选的门始终为0号和随意选择概率一样的,就三种可能
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:37:32 | 显示全部楼层
陈尚涵 发表于 2023-7-9 15:35
可能我没说清楚,这个程序是用通过模拟题目,输出一千万次剩下的门为汽车的次数
你这个不用程序,用数学 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:46:22 | 显示全部楼层
2/3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-9 15:52:23 | 显示全部楼层
确实,2/3,大概一个for循环应该就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:58:00 | 显示全部楼层
2/3 和 1/2 都各有道理~

假设选的都是 1 号门,那么主持人每次都会在 2 号门和 3 号门之间打开一个没有车的门,将所有情况做成表格如下:

1号门 2号门 3号门 不换

所以换的成功概率是 2/3。

而 1/2 的解释是:如果主持人打开了 1 扇没有车的门,那么剩下 2 个门不管我换或者不换,摆在眼前的概率都是 1/2。

这道题似乎目前两个派别都无法说服对方~

不过,利用程序模拟,可以明显看到换的成功率是 2/3,不换是 1/3:

  1. from random import choice

  2. def stay():
  3.     doors = ['car', 'goat', 'goat']
  4.     choose = choice(doors)
  5.     if choose == 'car':
  6.         return True
  7.     else:
  8.         return False
  9.    
  10. def exchange():
  11.     doors = ['car', 'goat', 'goat']
  12.     choose = choice(doors)
  13.     doors.remove(choose)
  14.     doors.remove('goat')
  15.     if doors[0] == 'car':
  16.         return True
  17.     else:
  18.         return False
  19.    
  20. if __name__ == '__main__':
  21.     total = 1000000
  22.     stay_win = 0
  23.     exchange_win = 0
  24.    
  25.     for i in range(total):
  26.         if stay():
  27.             stay_win += 1
  28.         if exchange():
  29.             exchange_win += 1

  30.     print(f"不换的成功率是:{stay_win / total}")
  31.     print(f"换的成功率是:{exchange_win / total}")
复制代码

1 万次测试结果如下:

不换的成功率是:0.341
换的成功率是:0.6606

10 万次测试结果如下:

不换的成功率是:0.33311
换的成功率是:0.66903

100 万次测试结果如下:

不换的成功率是:0.333643
换的成功率是:0.667619

1000 万次测试结果如下:

不换的成功率是:0.3333945
换的成功率是:0.6668342



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 15:58:52 | 显示全部楼层
  1. import random

  2. def xuanze():
  3.     k = [1, 1, 2]
  4.     random.shuffle(k)
  5.     xuan = random.randint(0, 2)
  6.     k.remove(k[xuan])
  7.     k.pop(k.index(1))
  8.     o = k[0]
  9.     if o == 2:
  10.         return True
  11.     return False

  12. def buxuan():
  13.     k = [1, 1, 2]
  14.     random.shuffle(k)
  15.     xuan = random.randint(0, 2)
  16.     if k[xuan] == 2:
  17.         return True
  18.     return False

  19. p = [xuanze() for i in range(10000)]
  20. q = [buxuan() for i in range(10000)]
  21. xuan1 = p.count(True)
  22. xuant = q.count(True)
  23. print("{:.3f}%".format(xuan1 / len(p) * 100))
  24. print("{:.3f}%".format(xuant / len(q) * 100))
复制代码


直接模拟,证明成功

确实大约是66%

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +1 收起 理由
陈尚涵 + 3 + 3 + 1 鱼B有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 16:06:50 | 显示全部楼层
小甲鱼 发表于 2023-7-9 15:58
2/3 和 1/2 都各有道理~

假设选的都是 1 号门,那么主持人每次都会在 2 号门和 3 号门之间打开一个没有 ...

忘了这是C\C++交流语言板块,习惯就写成 Python 代码了~



C 语言实现如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. int stay() {
  5.     int doors[3] = {1, 0, 0};   // 1代表'car', 0代表'goat'
  6.     int choose = doors[rand() % 3];
  7.     return choose == 1;
  8. }

  9. int exchange() {
  10.     int doors[3] = {1, 0, 0};   // 1代表'car', 0代表'goat'
  11.     int choose = doors[rand() % 3];
  12.     if (choose == 1) {
  13.         return 0;
  14.     } else {
  15.         return 1;
  16.     }
  17. }

  18. int main() {
  19.     srand(time(0));
  20.     int total = 1000000;
  21.     int stay_win = 0;
  22.     int exchange_win = 0;

  23.     for (int i = 0; i < total; i++) {
  24.         if (stay()) {
  25.             stay_win++;
  26.         }
  27.         if (exchange()) {
  28.             exchange_win++;
  29.         }
  30.     }

  31.     printf("不换的成功率是:%f\n", (double)stay_win / total);
  32.     printf("换的成功率是:%f\n", (double)exchange_win / total);

  33.     return 0;
  34. }
复制代码

评分

参与人数 1荣誉 +3 贡献 +3 收起 理由
sfqxx + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-9 16:08:45 | 显示全部楼层
Ewan-Ahiouy 发表于 2023-7-9 15:58
直接模拟,证明成功

确实大约是66%

模拟次数越多概率越准,我都是1千万次
python有点看不太懂, 是完全按照题意写的吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-9 16:49:12 | 显示全部楼层
陈尚涵 发表于 2023-7-9 16:08
模拟次数越多概率越准,我都是1千万次
python有点看不太懂, 是完全按照题意写的吧?

嗯,cpp有点麻烦,就写了python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-10 10:28:12 | 显示全部楼层
陈尚涵 发表于 2023-7-9 15:06
@zhangjinxuan @歌者文明清理员 @sfqxx @高山 @一点沙 来看看

c + + 的 问 题 不 要 叫 我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 02:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表