gpt4 book ai didi

python - 尝试用 Python 解决 Monty Hall 问题

转载 作者:行者123 更新时间:2023-12-01 05:02:34 27 4
gpt4 key购买 nike

我正在尝试理解 Monty Hall 问题的解决方案,我理解大部分代码,但卡在两部分上。

下面是代码,但具体来说我被困在这两部分

result[bad] = np.random.randint(0,3, bad.sum())

以及整个switch_guess函数。

如果有人能用简单的英语向我解释,那就太棒了。

#Simulates picking a prize door
def simulate_prizedoor(nsim):
return np.random.randint(0,3,(nsim))

#Simulates the doors guessed
def simulate_guesses(nsim):
return np.zeros(nsim, dtype=np.int)

#Simulates the "game host" showing whats behind a door
def goat_door(prize_doors, guesses):
result = np.random.randint(0,3, prize_doors.size)
while True:
bad = (result == prize_doors) | (result == guesses)
if not bad.any():
return result
result[bad] = np.random.randint(0,3, bad.sum())

#Used to change your guess
def switch_guess(guesses, goat_doors):
result = np.zeros(guesses.size)
switch = {(0, 1): 2, (0, 2): 1, (1, 0): 2, (1, 2): 1, (2, 0): 1, (2, 1): 0}
for i in [0,1,2]:
#print "i = ", i
for j in [0,1,2]:
#print "j = ", j
mask = (guesses == i) & (goat_doors == j)
#print "mask = ", mask
if not mask.any():
continue
result = np.where(mask, np.ones_like(result) * switch[(i, j)], result)
return result

#Calculates the win percentage
def win_percentage(guesses, prizedoors):
return 100 * (guesses == prizedoors).mean()

#The code to pull everything together
nsim = 10000

#keep guesses
print "Win percentage when keeping original door"
print win_percentage(simulate_prizedoor(nsim), simulate_guesses(nsim))

#switch
pd = simulate_prizedoor(nsim)
guess = simulate_guesses(nsim)
goats = goat_door(pd, guess)
guess = switch_guess(guess, goats)
print "Win percentage when switching doors"
print win_percentage(pd, guess)

最佳答案

… specifically I'm stuck on these two parts

result[bad] = np.random.randint(0,3, bad.sum())

让我们把它分解成几个部分。它可能有助于将 10000 减少到较小的值,例如 5,这样您就可以打印出这些值(通过 print 调用,或者在调试器)并查看发生了什么。

当我们启动此函数时,prize_doors 将具有从 02 的 5 个随机值,例如 2 2 0 1 2,而猜测将有5个值,全部为0,如0 0 0 0 0。因此,结果将从 0 到 2 的 5 个随机值开始,例如 0 2 2 0 1

每次第一次循环时,bad 将是一个包含 5 个 bool 值的列表,如果相应的值在resultprize_doorsguesses 中的相应值匹配。因此,在此示例中,True True False True False,因为猜测 #1 与 prize_doors 匹配,而猜测 #0 和 #3 与 goats 匹配。

不幸的是,我们将永远绕过该循环,因为循环内没有任何内容会修改 result,因此 bad 将是相同的永远,并且永远执行相同的检查总是会返回相同的值。

<小时/>

但是,如果您缩进 result[bad] = ... 行使其位于循环内,那么一切都会改变。所以,让我们假设这就是您应该做的,而您只是复制错误了。

当被视为数字时,TrueFalse 分别具有值 10。因此,bad.sum() 是对 bad 中有多少匹配项的计数,在本例中为 3

因此,np.random.randint(0, 3, bad.sum())02 中选择 3 个随机值,比方说 1 0 1

现在,result[bad] 选择 resultbad 中对应值为 True 的所有元素,因此在此例如,它是 result[0]result[1]result[3]

因此,我们最终将 1 0 1 分配给这三个选定的位置,因此 结果 现在为 1 0 2 1 1

因此,下次循环时,bad 现在是 True False False False False。我们仍然至少有一个 True 值,因此我们再次运行 result[bad] = 行。这次,bad.sum()1,因此我们选择 1 个随机值,假设为 0,然后分配该 1 个值到 result[0],因此 result 现在是 0 0 2 1 1

下一次,bad 现在是 False False False False False False,因此 bad.any()False,我们就完成了。

换句话说,每次通过时,我们都会获取所有与奖品门或山羊门都不匹配的值,并为它们选择一扇新门,直到最后没有这样的值为止。

关于python - 尝试用 Python 解决 Monty Hall 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com