简介
模拟使用来解决现实世界棘手问题的重要技术与手段。计算机可以通过模拟现实世界的运行提供在通常情况下无法获取的信息。通过模拟解决问题的实际情况包括但不限于以下几种:天气预测、飞行器设计、影视特效、甚至在军事领域也有所涉及。以上事例如果不通过模拟,那么实施过程将会十分复杂,往往也伴随着十分巨大的风险。即使是简单的模拟也能够解释重要的本质规律。
体育竞技有着悠久的历史,现代社会,体育竞技选手的差距越来越小,胜负也在毫厘之间,因此体育竞技分析也逐渐走上了舞台。
本节将通过计算机程序来模拟体育竞技中的某些属性环节,通过上千次不同级别对手的模拟比赛,揭示并分析体育竞技的规律。
问题描述
通过定义如下规则:两个球员在有一个四面边界的场地互相击球,发球之后交替击球直到能够判定得分为止,这个过程称之为回合;当其中一个球员未能进行合法击球时,回合结束,这名球员输掉这个回合。输掉回合的是发球方,那么发球权转移,输掉的是接球方则发球权不变。球员只能在自己的发球局中得分,首先获得十五分的球员胜利。
程序接收双方球员的水平值,然后利用这个值模拟多场比赛,程序最后输出比赛结果。
该问题的IPO描述如下:
输入:用户输入双方球员能力值,模拟比赛场次等
处理:模拟比赛过程
输出:双方球员赢得比赛的概率
代码设计
from random import random
def printIntro():
print("比赛模拟")
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):
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 gameOver(a, b):
return a==15 or b==15
def simOneGame(probA, probB):
scoreA,scoreB = 0, 0
serving = "A"
while not gameOver(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()
本例中使用自顶向下的方法解决问题,首先搭好mian函数中的框架,随后编写划分好的四个函数。
simNGames函数是整个代码的核心,基本思路是模拟多场比赛,跟踪记录球员的胜利场数,
代码中simOneGame函数用于模拟一场比赛,函数需要知道每个球员的概率并返回最终得分。
gameOver函数用于终结比赛循环,在比赛结束时返回True,未结束则返回False继续循环。
‘运行结果如下所示:
’