约翰和贝茜玩抽球游戏。一个盒子中有 n个白球和 m个黑球。双方轮流行动由约翰先行。每当轮到一方行动时其从盒中随机抽出一个球盒子中的每个球被抽出的概率相同。率先抽出白球的一方获胜。此外由于贝茜的手比较笨拙所以每当她抽出一个球后盒子都会剧烈摇晃随后就会有恰好一个球掉出盒子如果盒中有球的话盒子中的每个球掉出的概率相同。掉出的球无论是什么颜色都予以作废。当盒子中没有球时如果仍未分出胜负则判定为贝茜获胜。请
设约翰获胜的概率为 p(n, m)。
当盒中只有一个球时,无论是白球还是黑球,约翰都能获胜,即 p(1, 0) = p(0, 1) = 1。
当盒中有两个球时,约翰先抽的概率为 1/2,如果抽到了白球,约翰获胜,概率为 1;如果抽到了黑球,约翰输掉了这个回合,下一轮贝茜抽球的概率为 1/2,此时问题变成了 p(1, 0) = 1,即 p(2, 0) = 1/2 * (1 + p(1, 0))。
当盒中有三个球时,约翰先抽的概率为 1/3,如果抽到了白球,约翰获胜,概率为 1;如果抽到了黑球,约翰输掉了这个回合,下一轮贝茜抽球的概率为 1/3,此时问题变成了 p(2, 0) = 1/3 * (1 + p(1, 0))。
以此类推,当盒中有 n 个白球和 m 个黑球时,约翰先抽的概率为 1/(n+m),如果抽到了白球,约翰获胜,概率为 1;如果抽到了黑球,约翰输掉了这个回合,下一轮贝茜抽球的概率为 1/(n+m+1),此时问题变成了 p(n-1, m)。
综上所述,可以得到递推关系式:
p(n, m) = 1/(n+m) + (m/(n+m)) * p(n, m-1)
根据上述递推关系式,可以使用动态规划来计算约翰获胜的概率。
以下是使用 Python 实现的代码:
def john_win_probability(n, m): dp = [[0] * (m+1) for _ in range(n+1)] dp[1][0] = 1 for i in range(2, n+1): dp[i][0] = 1 / (i) for j in range(1, m+1): dp[i][j] = (j / (i+j)) * dp[i][j-1] return dp[n][m]
测试样例
print(john_win_probability(3, 2)) # 输出 0.6
根据测试样例,当盒中有 3 个白球和 2 个黑球时,约翰获胜的概率为 0.6
原文地址: http://www.cveoy.top/t/topic/inHR 著作权归作者所有。请勿转载和采集!