模拟体育乒乓球竞技分析(加强版)

from random import random
def printIntro():
    print("分析者:19统计1班陈奕芝 01")
    print("01号程序模拟两个选手A和B的乒乓球竞技比赛")
    print("01号程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
    a=eval(input("请输入选手A的能力值(0-1):"))
    b=eval(input("请输入选手B的能力值(0-1):"))
    n=eval(input("模拟比赛的场次:"))
    return a,b,n
def simNGames(n,probA,probB):#利用A,B的的能力值模拟N场比赛
    winsA,winsB=0,0
    for i in range(n):
        pingpangA,pingpangB=simOneGame(probA,probB)#simOneGame函数用于模拟一场比赛
        if(pingpangA>pingpangB):#计数循环,记录每个成员赢了多少局比赛
            winsA+=1
        else:
            winsB+=1
    return winsA,winsB
def gameOver(a,b):#比赛结束的条件(再一局比赛中,先得11分者为胜方;10平后,先得2分的一方为胜方)
    if(a-b==2 and a>=10 and b>=10):
        return True
    elif(b-a==2 and a>=10 and b>=10):
        return True
    if a==11 or b==11:
        return True
    else:
        return False
def simOneGame(probA,probB):#用于模拟一场比赛
    pingpangA,pingpangB=0,0
    serving="A"#先由A发球
    while not gameOver(pingpangA,pingpangB):
        if(serving=='A'):
            if random() < probA:#通过随机数和概率确定发球放是否赢得比分(random()<prob)
                pingpangA += 1#若A赢得比分,则发球权不变
            else:
                serving='B'#反之发球权给B
        else:
            if random() < probB:
                pingpangB += 1
            else:
                serving="A"
    return pingpangA,pingpangB
def printsummary(winsA,winsB):#输出A,B获胜的比赛场次及概率
    n=winsA+winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
def main():
    printIntro()
    probA,probB,n = getInputs()
    winsA,winsB=simNGames(n,probA,probB)
    printsummary(winsA,winsB)
main()

  

posted @ 2020-11-22 19:13  小猪猪。。。  阅读(134)  评论(0)    收藏  举报