Python 计算团队获胜的概率
我在计算A队在壁球比赛中获胜的可能性。两个小组都有3名成员: A队:有能力(r)40、50和70-B队有能力(r)75、25和30 赢得至少两场比赛的队赢得了比赛。如果A队按照上面给出的顺序比赛,B队选择一个随机顺序: (a) 估计TeamA获胜的概率 (b) 如果比赛在一个队赢了两场比赛后就结束了,那么预计的比赛次数是多少 我用这个方程式计算出A队赢一轮的概率:(A队赢的概率)=rA/(rA+rB) 到目前为止,我只是试图计算A队获胜的机会Python 计算团队获胜的概率,python,probability,Python,Probability,我在计算A队在壁球比赛中获胜的可能性。两个小组都有3名成员: A队:有能力(r)40、50和70-B队有能力(r)75、25和30 赢得至少两场比赛的队赢得了比赛。如果A队按照上面给出的顺序比赛,B队选择一个随机顺序: (a) 估计TeamA获胜的概率 (b) 如果比赛在一个队赢了两场比赛后就结束了,那么预计的比赛次数是多少 我用这个方程式计算出A队赢一轮的概率:(A队赢的概率)=rA/(rA+rB) 到目前为止,我只是试图计算A队获胜的机会 import random def game(a,
import random
def game(a,b,c,d,e,f):
overallprob = 0
for item in [a, b, c]:
probA = item / (item + d)
overallprob = overallprob + probA
for item in [a, b, c]:
probA = item / (item + e)
overallprob = overallprob + probA
for item in [a, b, c]:
probA = item / (item + f)
overallprob = overallprob + probA
print "Chances of team A winning =",round((overallprob / 9*100),2),"%"
game(40.0,50.0,60.0,75.0,25.0,30.0)
其中打印:
Chances of team A winning = 56.04 %
我不确定这是否正确,我想知道我是否可以从(b)部分得到任何帮助,因为我不确定从哪里开始你计算的是a队的随机球员击败b队的随机球员的几率 一旦考虑到团队之间可能的配对,团队A击败团队B随机排序的几率将变为61.23%
from itertools import permutations
def match_win_prob(ra, rb):
"""
Given the skills of players a and b,
return the probability of player a beating player b
"""
return ra / float(ra + rb)
def team_win_prob(x, y, z):
"""
Given the probability of a win in each match,
return the probability of being first to two games
(same as best-of-three)
"""
return x*y + x*(1.-y)*z + (1.-x)*y*z
def game_win_prob(As, Bs):
pairs = [[match_win_prob(a, b) for b in Bs] for a in As]
ways, prob = 0, 0.
for i,j,k in permutations(pairs):
ways += 1
prob += team_win_prob(i[0], j[1], k[2])
return prob / ways
def main():
p = game_win_prob([40, 50, 70], [75, 25, 30])
print('Chances of team A winning = {:.2f} %'.format(p * 100.))
if __name__=="__main__":
main()
你所计算的是a队随机球员击败B队随机球员的几率 一旦考虑到团队之间可能的配对,团队A击败团队B随机排序的几率将变为61.23%
from itertools import permutations
def match_win_prob(ra, rb):
"""
Given the skills of players a and b,
return the probability of player a beating player b
"""
return ra / float(ra + rb)
def team_win_prob(x, y, z):
"""
Given the probability of a win in each match,
return the probability of being first to two games
(same as best-of-three)
"""
return x*y + x*(1.-y)*z + (1.-x)*y*z
def game_win_prob(As, Bs):
pairs = [[match_win_prob(a, b) for b in Bs] for a in As]
ways, prob = 0, 0.
for i,j,k in permutations(pairs):
ways += 1
prob += team_win_prob(i[0], j[1], k[2])
return prob / ways
def main():
p = game_win_prob([40, 50, 70], [75, 25, 30])
print('Chances of team A winning = {:.2f} %'.format(p * 100.))
if __name__=="__main__":
main()
你需要一个精确的,数学上正确的答案还是一个相当精确的近似值?如果是后者,则根据经验解决问题:模拟两支球队进行一系列比赛,并持续计算每支球队赢得的N场比赛和进行的N场比赛。是的,近似值,好的,我会试一试谢谢,我只想首先确保(a)部分是正确的。您需要准确的,数学上正确的答案,还是一个相当精确的近似值?如果是后者,则根据经验解决问题:模拟两支球队进行一系列比赛,并持续计算每支球队赢得的N场比赛和进行的N场比赛。是的,近似值,好的,我会试一试谢谢,我只想先确保(a)部分正确谢谢这是一个很大的帮助,不过,我对第一个函数及其工作原理有点困惑。“tot_pm”和“n”用于什么?为什么用“pa”代替“tot_pm”不起作用?@user3047572抱歉。。。最后一分钟变量重命名:
tot\u pm
应为tot\u pa
,以确保命名一致性(固定)。在main()。n
变量只计算所有可能比赛的总数,因此我们可以在计算我们寻求的平均(预期)值时使用它作为分母:(a)a队赢得随机比赛的概率;(b) 在一场随机比赛中预计有N场比赛。好的,我现在明白了,非常感谢!我一直以为我在努力计算A队赢得一场比赛的概率,如果A队的所有3名球员都与B队的随机球员比赛,那么总共进行了3场比赛。这是否与你在我问题(a)部分所展示的概率相同?@user3047572或许如此。我相当肯定我写的脚本计算量太大了。例如,这会给出相同的结果:product([teamA],排列(teamB))
——换句话说,不要将teamA
(这意味着n=6
而不是n=36)
。一个比我更擅长概率的人可以写一个简单的公式来计算一次结果,而不是使用排列。如果您打印g1、g2、g3
(使用n=6
)的值,可能会建议对该问题进行更直接的攻击。感谢这是一个很大的帮助,但我对第一个函数及其工作方式有点困惑。“tot_pm”和“n”用于什么?为什么用“pa”代替“tot_pm”不起作用?@user3047572抱歉。。。最后一分钟变量重命名:tot\u pm
应为tot\u pa
,以确保命名一致性(固定)。在main()。n
变量只计算所有可能比赛的总数,因此我们可以在计算我们寻求的平均(预期)值时使用它作为分母:(a)a队赢得随机比赛的概率;(b) 在一场随机比赛中预计有N场比赛。好的,我现在明白了,非常感谢!我一直以为我在努力计算A队赢得一场比赛的概率,如果A队的所有3名球员都与B队的随机球员比赛,那么总共进行了3场比赛。这是否与你在我问题(a)部分所展示的概率相同?@user3047572或许如此。我相当肯定我写的脚本计算量太大了。例如,这会给出相同的结果:product([teamA],排列(teamB))
——换句话说,不要将teamA
(这意味着n=6
而不是n=36)
。一个比我更擅长概率的人可以写一个简单的公式来计算一次结果,而不是使用排列。如果打印g1、g2、g3
(使用n=6
)的值,则可能建议对问题进行更直接的攻击。