第一问:采用乒乓球比赛规则(学号21)个人赛
- 代码
from random import random # 打印程序介绍信息 def printIntro(): print("统计21号进行比赛分析结果:") print("这是团体赛模拟程序:") # 获得程序运行参数 def getInputs(): a = eval(input("请输入队伍A的能力值(0-1): ")) b = eval(input("请输入队伍B的能力值(0-1): ")) n = eval(input("模拟比赛的场次: ")) return a, b, n # 进行N场比赛 def simNGames(n, probA, probB): winsA, winsB = 0, 0 for i in range(n): for j in range(7): # 进行7局4胜的比赛 scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB # 正常比赛结束 def gameOver(a, b): return a == 11 or b == 11 def gameOver2(a, b): # 进行抢12比赛结束 return a == 12 or b == 12 # 进行一场比赛 def simOneGame(probA, probB): scoreA, scoreB = 0, 0 # 初始化AB的得分 serving = "A" while not gameOver(scoreA, scoreB): # 用while循环来执行比赛 if scoreA == 10 and scoreB == 10: return(simtwoGame2(probA,probB)) if serving == "A": if random() < probA: # 用随机数生成胜负 scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving="A" return scoreA, scoreB def simtwoGame2(probA,probB): scoreA, scoreB=10, 10 serving = "A" # 假如先让队伍A发球 while not gameOver2(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving = "A" return scoreA, scoreB def printSummary(winsA, winsB): 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()
-
结果
第一问:团体赛
- 代码
from random import random # 打印程序介绍信息 def printIntro(): print("统计21号进行比赛分析结果:") print("这是团体赛模拟程序:") # 获得程序运行参数 def getInputs(): a = eval(input("请输入队伍A的能力值(0-1): ")) b = eval(input("请输入队伍B的能力值(0-1): ")) n = eval(input("模拟比赛的场次: ")) return a, b, n # 进行N场比赛 def simNGames(n, probA, probB): winsA, winsB = 0, 0 for i in range(n): for j in range(7): # 进行7局4胜的比赛 scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB # 正常比赛结束 def gameOver(a, b): return a == 11 or b == 11 def gameOver2(a, b): # 进行抢12比赛结束 return a == 12 or b == 12 # 进行一场比赛 def simOneGame(probA, probB): scoreA, scoreB = 0, 0 # 初始化AB的得分 serving = "A" while not gameOver(scoreA, scoreB): # 用while循环来执行比赛 if scoreA == 10 and scoreB == 10: return(simtwoGame2(probA,probB)) if serving == "A": if random() < probA: # 用随机数生成胜负 scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving="A" return scoreA, scoreB def simtwoGame2(probA,probB): scoreA, scoreB=10, 10 serving = "A" # 假如先让队伍A发球 while not gameOver2(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving = "A" return scoreA, scoreB def printSummary(winsA, winsB): 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()
- 结果
第二问:采用篮球或者足球规则模拟比赛,分析体育竞技规则,模拟比赛。
- 代码
# -*- coding: utf-8 -*- from random import random def printIntro(): print("统计21号") print("这个程序模拟两个队伍A和B的篮球比赛") print("程序运行需要A和B队伍的平均能力值(以0到1之间的小数表示)") def getInput(): probA=eval(input("请输入队伍A的平均能力值(0-1):")) probB=eval(input("请输入队伍B的平均能力值(0-1):")) n=eval(input("模拟比赛场次:")) return probA,probB,n def Games(n,probA,probB): #全部比赛场次的各胜方总数分析 A,B=0,0 for i in range(n): a=fourGames(probA,probB) if a=="A": A+=1 else: B+=1 return A,B def fourGames(probA,probB): #一场比赛的胜利方判断 scoreA,scoreB=0,0 for i in range(4): scoreA,scoreB=onejieGame(probA,probB) if scoreA>scoreB: return 'A' return 'B' def onejieGame(probA,probB): #一小节比赛的比分总结 scoreA,scoreB=0,0 serving="A" while not gameOver(scoreA,scoreB): a=random() if serving=="A": if a<probA: scoreA+=2 else: serving="B" else: if a<probB: scoreB+=2 else: serving="A" return scoreA,scoreB def gameOver(a,b): return a==16 or b==16 def printsummary(A,B): n=A+B print("竞技开始分析,共模拟了{}场比赛".format(n)) print("选手A获胜{}场比赛,占比{:0.1%}".format(A,A/n)) print("选手B获胜{}场比赛,占比{:0.1%}".format(B,B/n)) def main(): printIntro() probA,probB,n=getInput() A,B=Games(n,probA,probB) printsummary(A,B) main()
- 结果
第三问:采用乒乓球、羽毛球、篮球、足球等规则中的一种。同时采用循环赛或者晋级赛形式,模拟分析4个队及以上体育竞技,并输出排名。
- 代码
from random import random def printIntro(): print("这个程序模拟四支队伍A,B,C,D的篮球比赛,赛制采取晋级制") print("程序运行需要A,B,C,D队伍的平均能力值(以0到1之间的小数表示)") def getInput(): probA=eval(input("请输入队伍A的平均能力值(0-1):")) probB=eval(input("请输入另一支队伍B的平均能力值(0-1):")) print("\n") return probA,probB def fourGames(x,y): #一场比赛的胜利方判断 scoreA,scoreB=0,0 for i in range(4): scoreA,scoreB=onejieGame(x,y) if scoreA>scoreB: return 'A' return 'B' def onejieGame(x,y): #一小节比赛的比分总结 scoreA,scoreB=0,0 serving="A" while not gameOver(scoreA,scoreB): a=random() if serving=="A": if a<x: scoreA+=2 else: serving="B" else: if a<y: scoreB+=2 else: serving="A" return scoreA,scoreB def gameOver(a,b): return a==16 or b==16 def printmean(c): print("竞技开始:") print("经过激烈的比赛,最终队伍{}获得了比赛".format(c)) print("恭喜{}队伍晋级!".format(c)) print("\n") printIntro() x,y=getInput() c=fourGames(x,y) printmean(c) print("请再次输入其余两支队伍的平均能力值") x,y=getInput() d=fourGames(x,y) printmean(d) print("晋级双方是{}和{}".format(c,d)) print("\n") print("请输入两支晋级队伍平均能力值") x,y=getInput() e=fourGames(x,y) print("恭喜{}获得本次比赛的总冠军!".format(e))
- 结果