????????我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克·莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇文章只有 1 个问题,使其成为一个总共有 50 个部分的系列。让我们潜入并激活我们的脑细胞。
图片由作者使用 DALL-E 3 提供。
????????掷骰子游戏,用两个骰子玩,是美国最快和最受欢迎的赌博游戏之一。计算与之相关的赔率是一项有启发性的练习。
????????规则如下:
????????问:玩家获胜的机会有多大?
????????首先,让我们检查两次掷骰子产生的总计数的出现频率。
两个骰子计数的总数
???????
????????若首次投出骰子获胜,必须是。?为了确保在第一次投掷中取得胜利,玩家必须总共掷出 7 或 11 个。第一次投掷获胜的概率可以计算如下:
共 6^2=36?不同结果
投出 7的结果是:
投出11 的结果是:
因而产生出 8种不同的骰子结果使得首投获胜。
Therefore, the probability of winning the first roll is equal to:
掷 2 的方法有:
(1,1)
(1, 2)
(2, 1)
(6, 6)
????????因此,有 4 种不同的掷骰方式会导致玩家在第一次掷骰时失败
????????因此,输掉第一卷的概率等于:
????????如果玩家在第一次投掷时没有获胜,他们仍然可以通过在总共掷出 7 分之前再次掷出点来确保胜利。我们可以采用减少样本空间的方法来计算该概率,如下图所示。例如,在掷出总共 7 个之前再次掷出总共 4 个的概率可以通过将第一次掷出总共 4 个的概率乘以在掷出总共 7 个之前再次掷出总共 4 个的概率来计算。
????????通过将所有概率相加得到总获胜概率,如下图所示:
????????总获胜概率
总之,玩家的获胜几率为49.3%。
import numpy as np
n_simulations = 100000
wins = 0
for _ in range(n_simulations):
first_roll = np.random.randint(1, 7, size=2).sum()
if first_roll in [7, 11]:
wins += 1
elif first_roll in [2, 3, 12]:
continue
else:
while True:
next_roll = np.random.randint(1, 7, size=2).sum()
if next_roll == 7:
break
elif next_roll == first_roll:
wins += 1
break
probability_of_winning = wins / n_simulations
print(f'Probability of winning : {probability_of_winning:.3f}')
# Output:
# Probability of winning : 0.494