模拟体育乒乓球竞技分析(加强版)
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()


浙公网安备 33010602011771号