我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克·莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》(Fifty Challenge Problems in Probability with Solutions)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇文章只有 1 个问题,使其成为一个总共有 50 个部分的系列。让我们潜入并激活我们的脑细胞 !
图片由作者使用 MidJourney 提供。
为了鼓励埃尔默的网球生涯,他的父亲会给他一个奖品,前提是:如果他在三盘系列赛中(至少)连续赢得两盘网球,可以获奖。赛制是:三局比赛,对手是他的父亲和俱乐部冠军。比赛安排有两个系列选项:父亲-冠军-父亲,或者,冠军-父亲-冠军,其中,冠军是比埃尔默的父亲更好的球员。埃尔默如何选择,才能有益获得连续两场获胜的机会?
问:埃尔默应该选择哪个系列?
直觉上,我们会认为埃尔默应该与冠军打更少的盘,因为冠军是更好的球员。然而,这种直觉是错误的,这里的目标是在三盘系列赛中至少连续赢得两盘。这意味着埃尔默需要赢得第二盘。
从这个事实说明,本目标函数是两个事件的联合分布。因此,将全部事件解构后的概率分布需要完整描述。
我们假设赢一盘对阵父亲的概率是 f,赢一盘对阵冠军的概率是 c。然后,我们可以计算获得至少两次连续获胜的概率。之后,我们可以比较两种情况的总概率:先与父亲对战,与先与冠军对战。我们在下表中总结了结果:
假设赢一盘对阵父亲的概率更高,那么 f 大于 c,这意味着 2 - f 小于 2 - c。
因此,如果埃尔默先与冠军对战,获得两连胜的总概率更高,他应该选择冠军-父亲-冠军系列赛。
import numpy as np
# play the series
def play_series(p1, p2):
prob = [p1, p2, p1]
elmer_prob = np.random.rand(3)
elmer_wins = elmer_prob < prob
# check if Elmer wins at least two sets in a row
if elmer_wins[0] == 1 and elmer_wins[1] == 1:
return 1
elif elmer_wins[1] == 1 and elmer_wins[2] == 1:
return 1
else:
return 0
N, f, c = 10000, 0.9, 0.6
print(f'N = {N}, f = {f}, c = {c}')
# Simulating FCF Series
print(f'Proportion of time Elmer won a prize in {N} FCF simulation: ', np.mean([play_series(f,c) for _ in range(N)]))
total_prob = (2-f)*f*c
print(f'P[FCF]: {total_prob:.3f}')
# Simulating CFC Series
print(f'Proportion of time Elmer won a prize in {N} CFC simulation: ', np.mean([play_series(c,f) for _ in range(N)]))
total_prob = (2-c)*c*f
print(f'P[CFC]: {total_prob:.3f} \n')
程序结果:
# Outputs:
# N = 10000, f = 0.9, c = 0.6
# Proportion of time Elmer won a prize in 10000 FCF simulation: 0.5934
# P[FCF]: 0.594
# Proportion of time Elmer won a prize in 10000 CFC simulation: 0.7519
# P[CFC]: 0.756
这就是这个网球问题的全部内容。欢迎任何反馈或问题!该代码可在我的 Github 上找到。请继续关注本系列的下一部分!:)