比赛模拟
作者:互联网
from random import random def printIntro(): #打印程序介绍信息 print("23谢宝谊进行比赛分析结果:") print("这个程序模拟两个队伍A和B的某种竞技比赛") print("程序运行需要队伍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): # 进行N场比赛 winsA, winsB = 0, 0 for i in range(n): for j in range(5): #进行5局3胜的比赛 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()
# -*- encoding:utf-8 -*- ''' 模拟足球竞技 @author: bpf ''' # 比赛规则: # 1. 比赛分为两场,每场为45分钟 # 上半场: 一方挑选进攻的球门,另一方获得开球权 # 下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权 # 2. 在进球后开球时,开球方为失球一方 # 3. 在没有违反任何比赛规则时,进攻球队得分。 # 4. 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。 from random import random, randint from time import time def printInfo(): ''' function: 打印程序的介绍信息 ''' print("{:*^70}".format("产品简介")) print("足球竞技模拟") print("通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!") print("23号谢宝谊") print("{:*^70}".format("模拟开始")) def getInputs(): ''' function: 获得用户输入的参数 ''' probA = eval(input("请输入队伍A的能力值(0~1):")) probB = eval(input("请输入队伍B的能力值(0~1):")) n = eval(input("请输入需要模拟比赛的场次数:")) return probA, probB, n def printResult(n, via, winsA, winsB): ''' function: 输出模拟比赛的结果 ''' print("{:*^70}".format("模拟结束")) print("竞技分析开始,共模拟{}场比赛。".format(n)) print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n)) print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n)) print(">>>两队平局{}场,占比{:0.1%}".format(via,via/n)) def simNGames(n, probA, probB): ''' function: 模拟n场比赛 n: 模拟n场比赛 probA, probB: 分别为队伍A和B的能力值 winsA, winsB: 队伍A和B赢得比赛的场数,总共n场 ''' via, winsA, winsB = 0, 0, 0 for _ in range(n): scoreA, scoreB = simOneGame(probA, probB) if scoreA == scoreB: via += 1 elif scoreA > scoreB: winsA += 1 else: winsB += 1 return via, winsA, winsB def simOneGame(probA, probB): ''' function: 模拟一场比赛, 分上半场和下半场 probA, probB: 分别为队伍A和B的能力值 scoreA, scoreB: 分别为队伍A和B一场比赛的分数 return: 返回队伍A和B在本场比赛中获得的分数 ''' winA, winB = 0, 0 for N in range(2): scoreA, scoreB = simAGame(N, probA, probB) winA += scoreA winB += scoreB return winA, winB def simAGame(N, probA, probB): ''' function: 模拟半场比赛 probA, probB: 分别为队伍A和B的能力值 scoreA, scoreB: 分别为队伍A和B半场比赛的分数 return: 返回队伍A和B在本半场比赛中获得的分数 ''' scoreA, scoreB = 0, 0 if N == 0: serving = 'A' # 发球方 else: serving = 'B' for _ in range(gameOver()): if serving == 'A': if random() < probA: scoreA += 1 serving = 'B' else: if random() < probB: scoreB += 1 serving = 'A' return scoreA, scoreB def gameOver(): ''' function: 定义半场比赛的结束条件 通过randint产生一个随机数作为半场比赛的回合数, 若达到半场比赛的回合数则结束比赛 return: 若比赛结束的条件成立返回真,否则为假 ''' return randint(3, 10) if __name__ == "__main__": printInfo() probA, probB, n = getInputs() Time = time() via, winsA, winsB = simNGames(n, probA, probB) print("模拟用时: {:.1f}s".format(time()-Time)) printResult(n, via, winsA, winsB)
from random import random def printIntro(): #打印程序介绍信息 print("23号谢宝谊进行比赛分析结果:") print("这个程序模拟两个选手A和B的某种竞技比赛") print("程序运行需要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): # 进行N场比赛 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比赛结束 if abs((a-b))>=2: return a,b 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" 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) n=input("输入任何数") main()
标签:winsB,比赛,scoreB,probB,probA,模拟,scoreA 来源: https://www.cnblogs.com/datuxx/p/14021137.html