Python 计算团队获胜的概率

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,

我在计算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,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
)的值,则可能建议对问题进行更直接的攻击。