参考点
if的多元判断及跳出
from random import random
#定义输入
def printIntro():
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 simOneGame(probA, probB):
scoreA, scoreB = 0, 0
if not((abs(scoreA-scoreB)==2) and ( scoreA>=10 and scoreB>=10)) or \
((abs(scoreA-scoreB)>=2) and (scoreA==11 or scoreB == 11)) : #多元判断;乒乓球结束规则
for i in range(1,31):
if ((abs(scoreA - scoreB) == 2) and (scoreA >= 10 and scoreB >= 10)) or \
((abs(scoreA - scoreB) >= 2) and (scoreA == 11 or scoreB == 11)) == True:
break #第一次成功判断就输出,不需要全部循环完30次
elif i in [1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30]: #a发球阶段
if random() < probA:
scoreA += 1
else:
scoreB +=1
else: #b发球阶段
if random() < probB:
scoreB += 1
else:
scoreA+=1
return scoreA, scoreB
#模拟多场比赛
def simNGames(n, probA, probB):
winsA, winsB = 0, 0
for i in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
#定义输出
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()
结果展示:
这个程序模拟两个乒乓球选手A和B的竞技比赛
程序运行需要A和B的能力值(以0到1之间的小数表示)
请输入选手A的能力值(0-1): 0.878
请输入选手B的能力值(0-1): 0.821
模拟比赛的场次: 100000
竞技分析开始,共模拟100000场比赛
选手A获胜71142场比赛,占比71.1%
选手B获胜28858场比赛,占比28.9%