有趣的概率——车羊问题与硬币问题

发布时间 2023-10-11 16:02:46作者: glowwormss

 

 

1、经典车羊问题

假设你参加一个游戏节目,有三扇关闭的门,其中一扇后面有一辆汽车,而其他两扇后面是山羊。你首先选择一扇门,然后主持人打开另外两扇门中的一扇,露出其中一只山羊。

现在,你可以选择是否改变自己的选择,选择另外一扇未被打开的门。那么,应该改变选择还是保持原来的选择呢?

import random

def monty_hall_simulation(change_choice, num_trials):
    wins_times = 0
    
    for _ in range(num_trials):
        doors = ['car', 'goat', 'goat']
        random.shuffle(doors)  # 随机排列门的位置        
        first_selected_door = random.randint(0, 2)  # 随机选择一扇门
        
        # 主持人打开一扇有山羊的门
        opened_door = next(i for i in range(3) if i != first_selected_door and doors[i] == 'goat')
#判断是否选择交换
if change_choice: selected_door = next(i for i in range(3) if i not in (first_selected_door, opened_door)) else: selected_door = first_selected_door if doors[selected_door] == 'car': wins_times += 1 win_percentage = (wins_times / num_trials) * 100 return win_percentage # 进行10000次实验 win_percentage_with_change= monty_hall_simulation(change_choice=1, num_trials=10000) win_percentage_without_change= monty_hall_simulation(change_choice=0, num_trials=10000) print(f"改变选择时获胜的概率: {win_percentage_with_change}%") print(f"保持选择时获胜的概率: {win_percentage_without_change}%") #输出 改变选择时获胜的概率: 66.25% 保持选择时获胜的概率: 33.22%

2、假如我有初始筹码一百块钱,现在有个抛硬币的游戏,抛出正反面的概率是0.5,每次抛出正面,我的筹码量可以增加80%,抛出反面则减少50%,那么我该玩这个游戏吗?

 2.1 如果每次必须全部筹码

def get_res(num_trials):
    x=100

    for _ in range(num_trials):
        if func_p(0.5) == 1:
            x=x*1.8
        else:
            x=x*0.5
    return x

res=get_res(100000)

print ("平均收益为:"+str(res-100))
#输出
#平均收益为:-100.0

 

 

 2.1 如果可以改变筹码量

 

#单次抛硬币后我筹码的期望为0.5*180+0.5*50=115,只要有充足的资金,不管玩几次,单次的期望始终为正值
def
get_res(num_trials): res=0 for _ in range(num_trials): x=100 #每次筹码量固定 if func_p(0.5) == 1: x=x*1.8 else: x=x*0.5 res=res+x return (res/num_trials) res=get_res(100000) print ("平均收益为:"+str(res-100)) #输出 #平均收益为:15.092299999999994