蒙蒂四门 python
Monty 4doors python
我正在编写一个程序来计算 Monty Hall 问题中有 4 扇门的概率,但未打印更改选择的概率。
import random
door = ['a', 'b', 'c', 'd']
nc = 0 # When not changed
c = 0 # When changed
tr = 100 #Total number of iterations
for a in range(tr):
car = random.randint(0, 3) #Inquiry number with car behind
pc = random.randint(0, 3) #Inquiry number chosen by the participant
ed = [] #Empty door
for i in range(4):
if i != pc and i != car:
ed.append(door[i])
com = random.sample(ed, 2)
if pc == car:
nc += 1
def list_remover(the_list, val):
while val in the_list:
the_list.remove(val)
list_remover(ed, com)
if not ed:
c += 1
print((nc / tr) * 100, "%")
print((c / tr) * 100, "%")
最初发布的代码不清楚(可能是缩进问题,我没有遵循代码逻辑)。
但是,对于任意数量的门的 Monty Hall 模拟如下。
代码
from random import choice
# Number of doors
N_doors = int(input("How many doors (>= 3? "))
wins_change = 0 # number of wins when we change doors
wins_no_change = 0 # number of wins without changing doors
doors = list(range(1, N_doors+1)) # doors as list [1, 2, ... N_doors]
N_Trials = 10000 # number of times to run simulation
for K in range(1, N_Trials):
# Host randomly chooses a door for answer
host_pick = choice(doors)
# Player randomly chooses a door for their answer
player_pick = choice(doors)
# Host picks a door to show
# that's not host_pick or player_pick
# i.e. door won't be host_pick or player_pick
show = choice([i for i in doors if i != host_pick and i != player_pick])
# Update win count if player doesn't change selection now that a door is shown
if host_pick == player_pick:
wins_no_change += 1
# Player changes selection
# i.e. picks door that's not shown and wasn't their original pick
player_pick = choice([i for i in doors if i != show and i != player_pick])
# Player wins if player_pick equals host_pick
if player_pick == host_pick:
wins_change += 1
# show results
print(f'Probablity winning not changing selection {wins_no_change/N_Trials:.2%}')
print(f'Probablity winning after changing selection {wins_change/N_Trials:.2%}')
测试
测试 3 扇门
How many doors (assume >= 3)? 3
Probablity winning not changing selection 33.29%
Probablity winning after changing selection 66.70%
测试 4 扇门
How many doors? 4
Probablity winning not changing selection 25.73%
Probablity winning after changing selection 36.90%
注:
- 3门答案同意Monty Hall problem
- 4门答案符合数学推导monty hall question with 4 doors
我正在编写一个程序来计算 Monty Hall 问题中有 4 扇门的概率,但未打印更改选择的概率。
import random
door = ['a', 'b', 'c', 'd']
nc = 0 # When not changed
c = 0 # When changed
tr = 100 #Total number of iterations
for a in range(tr):
car = random.randint(0, 3) #Inquiry number with car behind
pc = random.randint(0, 3) #Inquiry number chosen by the participant
ed = [] #Empty door
for i in range(4):
if i != pc and i != car:
ed.append(door[i])
com = random.sample(ed, 2)
if pc == car:
nc += 1
def list_remover(the_list, val):
while val in the_list:
the_list.remove(val)
list_remover(ed, com)
if not ed:
c += 1
print((nc / tr) * 100, "%")
print((c / tr) * 100, "%")
最初发布的代码不清楚(可能是缩进问题,我没有遵循代码逻辑)。
但是,对于任意数量的门的 Monty Hall 模拟如下。
代码
from random import choice
# Number of doors
N_doors = int(input("How many doors (>= 3? "))
wins_change = 0 # number of wins when we change doors
wins_no_change = 0 # number of wins without changing doors
doors = list(range(1, N_doors+1)) # doors as list [1, 2, ... N_doors]
N_Trials = 10000 # number of times to run simulation
for K in range(1, N_Trials):
# Host randomly chooses a door for answer
host_pick = choice(doors)
# Player randomly chooses a door for their answer
player_pick = choice(doors)
# Host picks a door to show
# that's not host_pick or player_pick
# i.e. door won't be host_pick or player_pick
show = choice([i for i in doors if i != host_pick and i != player_pick])
# Update win count if player doesn't change selection now that a door is shown
if host_pick == player_pick:
wins_no_change += 1
# Player changes selection
# i.e. picks door that's not shown and wasn't their original pick
player_pick = choice([i for i in doors if i != show and i != player_pick])
# Player wins if player_pick equals host_pick
if player_pick == host_pick:
wins_change += 1
# show results
print(f'Probablity winning not changing selection {wins_no_change/N_Trials:.2%}')
print(f'Probablity winning after changing selection {wins_change/N_Trials:.2%}')
测试
测试 3 扇门
How many doors (assume >= 3)? 3
Probablity winning not changing selection 33.29%
Probablity winning after changing selection 66.70%
测试 4 扇门
How many doors? 4
Probablity winning not changing selection 25.73%
Probablity winning after changing selection 36.90%
注:
- 3门答案同意Monty Hall problem
- 4门答案符合数学推导monty hall question with 4 doors