三门问题(Monty Hall Problem)你一定能理解的Python代码!

问题描述

奖品随机分布在3扇门后,客户随机选择其中一扇,主持人打开另外两扇中任意没有奖品的一扇,问客户选择以下哪种策略赢面更大:
1.坚持原来的选择
2.改选剩下的那扇未打开的门

说实话,就算我跑出来结果也想不通为什么。不多废话了,上代码。

代码

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 13 17:41:35 2023

@author: sixing liu
"""

from numpy import random
import pandas as pd

class Game:
    """
    定义三门游戏
    """    
    
    def __init__(self):
        '''
        准备奖池
        '''
        pool = [True, False, False] # 奖池中有一个奖品,并由True标记
        random.shuffle(pool) # 打乱奖池
        pool = pd.DataFrame(pool, columns=['Prize']) # 门序号是pool.index
        self.pool = pool
        
    def choice_1st(self):
        '''
        第一次选择
        '''
        self.choice1 = random.randint(0, 2) # 在[0, 1, 2] 中随意选择一个数字
        # print('Your first choice is {}'.format(self.choice1))
        self.choice = self.choice1
    
    def host_drop(self):
        '''
        主持人环节,在你选择的序号以外,从奖池中去掉一个非奖品(FALSE)
        '''
        pool_host = self.pool.drop(self.choice1) # 主持人看到的奖池
        choice_host = pool_host[pool_host['Prize'] == False].index[0] # 主持人的选择
        self.pool = self.pool.drop(choice_host) # 剩下的奖池
        # print('Host has drop')
        
    def choice_2st(self, switch=True):
        '''
        第二次选择,
            如果你选择更换第一次的选择,则swith = True
            保持第一次的选择,则swith = False
        '''
        choices = list(self.pool.index)
        if switch:
            # 更换选择
            choices.remove(self.choice1)
            self.choice2 = choices[0]
        else:
            self.choice2 = self.choice1 # 保持选择
        # print('Your second choice is {}'.format(self.choice2))
        self.choice = self.choice2
            
    def prize(self):
        '''
        你的奖品
        '''
        return self.pool.loc[self.choice, 'Prize']
         
def play(switch: bool):
    game = Game() # 开始游戏,创建奖池
    game.choice_1st() # 你的回合,抽卡!
    game.host_drop() # 主持人的回合, 奖池有些不一样了
    game.choice_2st(switch) # 你的回合,“生存还是死亡是一个问题”
    prize = game.prize() # 来看一看你得到了什么狗shit吧
    return prize


# 这样的结果,说实话,我不李姐
ps = []
for i in range(1000):
    p = play(switch=True)
    # p = play(switch=False)
    ps.append(p)
    
ps = pd.Series(ps)
prob = len(ps[ps == True]) / len(ps) # 换门的概率约为0.66 (TMD还是想不通) 

直接复制就可以运行。代码本身还是很容易理解的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值