排球比赛——预测
赛制规定
前4局比赛采用5局3胜制,每个队只有赢得至少25分,饼统摄超过对方2分时,才胜1局。
正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按照原位置顺序继续比赛到结束。
在决胜局(第五局)之比赛,先获得15分并领先对方2分为胜利。
1 from random import random 2 3 def printIntro(): # 打印程序介绍信息 4 print("2019310143026 马晓嘉") 5 print('这个程序模拟两个队伍A和B的排球竞技比赛') 6 print('程序运行需要A和B的能力值(以0到1之间的小数表示)') 7 8 def getInputs(): # 获得程序运行参数 9 a = eval(input('请输入队伍A的能力值(0-1):')) 10 b = eval(input('请输入队伍B的能力值(0-1):')) 11 n = eval(input('模拟比赛场次:')) 12 return a, b, n 13 14 def simOneGame(probA, probB): # 进行决赛 15 scoreA, scoreB =0, 0 16 serving = 'A' 17 while not gameOver(scoreA, scoreB): 18 if serving == 'A': 19 if random() > probA: 20 scoreB += 1 21 serving = 'B' 22 else: 23 scoreA += 1 24 else: 25 if random() > probB: 26 scoreA += 1 27 serving = 'A' 28 else: 29 scoreB += 1 30 return scoreA, scoreB 31 32 def simfirstgame(probA, probB): 33 scoreA, scoreB = 0, 0 34 for i in range(4): 35 s1, s2=0, 0 36 while not gameover(s1, s2): 37 if random()<probA: 38 s1+=1 39 elif random()<probB: 40 s2+=1 41 if s1>s2: 42 scoreA+=1 43 else: 44 scoreB+=1 45 return scoreA, scoreB 46 47 def simNGames(n, probA, probB): #进行N场比赛 48 winsA, winsB = 0, 0 # 初始化AB的胜场数 49 for i in range(n): 50 k, l=simfirstgame(probA, probB) 51 if k==1: 52 winsB+=1 53 continue 54 elif k==3: 55 winsA+=1 56 continue 57 scoreA, scoreB = simOneGame(probA, probB) 58 if scoreA > scoreB: 59 winsA += 1 60 else: 61 winsB += 1 62 return winsA, winsB 63 64 def gameOver(c, d): #比赛结束 65 return (c>=15 and c-d>=2) or (d>=15 and d-c>=2) 66 def gameover(scoreA, scoreB): 67 return (scoreA>=25 and scoreA-scoreB>=2) or (scoreB>=25 and scoreB-scoreA>=2) 68 69 70 def printSummary(n ,winA, winB): #打印比赛结果 71 print('竞技分析开始,共模拟{}场比赛'.format(n)) 72 print('队伍A获胜{}场比赛,占比{:.2f}%'.format(winA, winA/n*100)) 73 print('队伍B获胜{}场比赛,占比{:.2f}%'.format(winB, winB / n * 100)) 74 def main(): 75 printIntro() 76 probA, probB, n =getInputs() 77 winsA, winsB = simNGames(n, probA, probB) 78 printSummary(n, winsA, winsB) 79 80 main() 81 82 def GameOver(N,scoreA,scoreB): 83 if N<=4: 84 return(scoreA>=25 and scoreB>=25 and abs(scoreA-scoreB)>=2) 85 else: 86 return(scoreA>=15 and abs(scoreA-scoreB)>=2) or (scoreB>=15 and abs(scoreA-scoreB)>=2) 87 ai=[] 88 bi=[] 89 try: 90 for scoreA,scoreB in ((1,25),(1,26),(25,25),(16,17),(28,30)): 91 if GameOver(scoreA,scoreB): 92 ai.append(scoreA) 93 bi.append(scoreB) 94 except: 95 print('Error') 96 97 print(ai) 98 print(bi)
结果如下