《三门问题》——Python模拟

1. 问题描述

三门问题(蒙提霍尔问题):三扇门后有一个正确答案,两个错误答案。
当你做出选择时,事先知道结果的主持人会为你在其它两扇门中排除一个错误答案,然后询问你是否更改你的选择。
例子:现在有1号,2号,3号三扇门
在介绍完规则后,你选择了1号门,然后主持人告诉你3号门是错误的,你是否会更改你的答案呢?

本文尝试模拟较多次的实验数据来观察“修改与否”对结果的影响。

2.过程模拟

2.1 代码实现

直接上代码(逻辑已写在注释中,故不赘述):

import random


right_question = random.randint(1, 3)   # 使用随机数来指定正确的门牌号
doors = [1, 2, 3]
your_question = int(input('您选择几号门?'))
doors.remove(right_question)   # 将正确答案从列表中移除后,剩余的都是错误答案
if your_question != right_question:   # 如果选手选择的答案是错误的:
    doors.remove(your_question)   # 将选手选择的门从列表中移除
    print(f'主持人为您排除的错误答案为:{doors}')   # 此时列表中的号码就是主持人为选手排除的另一个错误答案
    is_change = input('是否更改您的答案(y/n):')
    if is_change == 'y':
        print('恭喜!获得奖金500w!')
    if is_change == 'n':
        print(f'你猜错了,正确答案是{right_question}')
else:   # 如果选手的选择是正确的:
    wrong_question_index = random.randint(0, 1)   # 产生一个随机数为其随机排除一个错误答案
    print(f'主持人为您排除的错误答案为:{doors[wrong_question_index]}')
    is_change = input('是否更改您的答案(y/n):')
    if is_change == 'y':
        print(f'你猜错了,正确答案是{right_question}')
    if is_change == 'n':
        print('恭喜!获得奖金500w!')

2.2 结果预览

3. 循环往复

        模拟一次过程并不是重点,我们的重点是多次实验,观察玩家修改与否对中奖的影响。

        上述代码中的人为操作均改为生成随机数进行判断,这样就可以自动化运行:

import random


count = 1000000  # 试验次数,暂设为100万次
player_change_wish = 50  # 选手的修改意愿值,此值越高,选手修改自己选择的概率越大
# 下面四个参数分别统计四种情况出现的次数:
unchange_right = 0  # 原本是正确的,并且未修改
unchange_wrong = 0  # 原本是错误的,并且未修改
change_right = 0    # 原本是错误的,修改了的
change_wrong = 0    # 原本是正确的,修改了的


for i in range(0, count):   # 实验指定次数
    right_question = random.randint(1, 3)  # 使用随机数来指定正确的门牌号
    your_question = random.randint(1, 3)
    if your_question != right_question:  # 如果选手选择的答案是错误的:
        is_change = random.randint(1, 100)
        if is_change <= player_change_wish:  # 用生成随机数和修改意愿比较来判断选手是否修改
            change_right += 1
        else:
            unchange_wrong += 1
    else:  # 如果选手的选择是正确的:
        is_change = random.randint(1, 100)
        if is_change <= player_change_wish:
            change_wrong += 1
        else:
            unchange_right += 1

    i += 1

print(f'未修改 且 正确的次数:{unchange_right}, 占比为:{round(unchange_right / count, 3)}')
print(f'未修改 且 错误的次数:{unchange_wrong}, 占比为:{round(unchange_wrong / count, 3)}')
print(f'修改 且 正确的次数:{change_right}, 占比为:{round(change_right / count, 3)}')
print(f'修改 且 错误的次数:{change_wrong}, 占比为:{round(change_wrong / count, 3)}')
print(f'获奖的次数:{unchange_right + change_right}, 占比为:{(unchange_right + change_right) / count}')

        程序运行结果不明显,将其列在表格中便于观察:

        

修改意愿:0
情景次数占比

未修改 且 正确

3329260.333

未修改 且 错误

6670740.667

修改 且 正确

00

修改 且 错误

00
最终获奖3329260.332926
修改意愿:10
情景次数占比

未修改 且 正确

3004190.3

未修改 且 错误

5997400.6

修改 且 正确

665030.067

修改 且 错误

333380.033
最终获奖3669220.366922
修改意愿:20
情景次数占比

未修改 且 正确

2667500.267

未修改 且 错误

5333210.533

修改 且 正确

1332660.133

修改 且 错误

666630.067
最终获奖4000160.400016
修改意愿:30
情景次数占比

未修改 且 正确

2337250.234

未修改 且 错误

4661840.466

修改 且 正确

1999130.2

修改 且 错误

1001780.1
最终获奖4336380.433638
修改意愿:40
情景次数占比

未修改 且 正确

2002740.2

未修改 且 错误

3995850.4

修改 且 正确

2666260.267

修改 且 错误

1335150.134
最终获奖4669000.4669
修改意愿:50
情景次数占比

未修改 且 正确

1671470.167

未修改 且 错误

3335970.334

修改 且 正确

3330990.333

修改 且 错误

1661570.166
最终获奖5002460.500246
修改意愿:60
情景次数占比

未修改 且 正确

1333180.133

未修改 且 错误

2665480.267

修改 且 正确

3999490.4

修改 且 错误

2001850.2
最终获奖5332670.533267
修改意愿:70
情景次数占比

未修改 且 正确

1002720.1

未修改 且 错误

2002340.2

修改 且 正确

4670010.467

修改 且 错误

2324930.232
最终获奖5672730.567273
修改意愿:80
情景次数占比

未修改 且 正确

664870.066

未修改 且 错误

1329990.133

修改 且 正确

5343570.534

修改 且 错误

2661570.266
最终获奖6001590.600159
修改意愿:90
情景次数占比

未修改 且 正确

334050.033

未修改 且 错误

669050.067

修改 且 正确

6002080.6

修改 且 错误

2994820.299
总计6336130.633613
修改意愿:100
情景次数占比

未修改 且 正确

00

未修改 且 错误

00

修改 且 正确

6674020.667

修改 且 错误

3325980.333
总计6674020.667402

        根据上述实验数据可以看出:随着修改意愿逐步地提高(100万次实验中修改选择的次数增加),最终获奖的概率也在增加。

        个人粗鄙的理解:选手第一次做出选择时,选对的概率为三分之一,选错的概率为三分之二。当被问及是否更改时,如果选择更改,那么将你原本对的选择修改为错误的概率就是三分之一,反之,将原本错误的选择更改为正确的概率就变为了三分之二。而不是主持人排除一个错误结果后的二分之一。

        注:① 表格中保留三位小数的占比是四舍五入后的结果,可能会出现相加不为1的情况;

               ② 表格中的数据为多次运行后趋于稳定的数据,精度为0.001

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值