我们在这个实例中,我们需要根据对两个人A、B的能力值来预测两人的胜率各是多少。
我们假定以下比赛规则:
双人击球比赛:
1、A、B两个人,回合制的五局三胜。
2、开始时一方先发球,直至判分,接下去胜者发球。
3、球员只能在发球局得分,15分胜一局。
我们处理一个问题时的两种思路有自顶而下和自底而上:
自顶向下:(执行)
将一个很大的问题表述为许许多多个小问题的组合,然后利用相同的方法来分解小问题,直到小问题可以简单解决。
自底向上:(设计)
分单元去测试,逐步组装,即按自顶向下的相反路径去操作,直到系统每一部分以组装的思路都经过测试与验证。
在这道题中,我们先分析题目的步骤:
步骤:
1、整体框架
2、将最基本的介绍性信息打出
3、获得参数
4、通过得到A和B两人的各项能力值来模拟n局比赛
5、输出球员模拟的比赛获胜情况,并算出概率
下面我们就一步步来实现:
- 整体框架
def main():
Printintro()#打印基本的介绍性信息
A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
winsA,winsB = simuGames(A,B,n)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次
Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率
if __name__ == '__main__':
main()
- 打印最基本的介绍性信息
def Printintro():
print('这是一个python竞技体育的小项目')
print('用来模拟两个运动员进行比赛,从而估算出胜率')
print('运动员A和运动员B的能力值在0-1之间')
- 获得参数
def getInput():
A = eval(input('请输入运动员A的能力值:'))
B = eval(input('请输入运动员B的能力值:'))
n = eval(input('请输入比赛的总回合数:'))
return A,B,n
- 通过得到A和B两人的各项能力值来模拟n局比赛
这部分是本题中稍难的地方,对初学者不太友好,需要多看几遍
def simuGames(A,B,n):
winsA,winsB = 0,0
for i in range(n):
scoreA,scoreB = simuoneGame(A,B)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsA
def simuoneGame(A,B):
scoreA,scoreB = 0,0
FQ = 'A'
while not game_over(scoreA,scoreB):
if FQ == 'A':
if random.random() < A:
scoreA += 1
else:
FQ = 'B'
else:
if random.random() < B:
scoreB += 1
else:
FQ = 'A'
return scoreA,scoreB
- 输出球员模拟的比赛获胜情况,并算出概率
def Printsumary(winsA,winsB):
N = winsA + winsB
print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))
以上就是所有的步骤,最终整合一下:
import random
def PrintIntro():
print('这是一个python竞技体育的小项目')
print('用来模拟两个运动员进行比赛,从而估算出胜率')
print('运动员A和运动员B的能力值在0-1之间')
def getInput():
A = eval(input('请输入运动员A的能力值:'))
B = eval(input('请输入运动员B的能力值:'))
n = eval(input('请输入比赛的总回合数:'))
return A,B,n
def simGames(n,A,B):
winsA,winsB = 0,0
for i in range(n):
scoreA,scoreB = simoneGames(A,B)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsB
def simoneGames(A,B):
scoreA,scoreB = 0,0
FQ = 'A'
while not Gameover(scoreA,scoreB):
if FQ == 'A':
if random.random() < A:
scoreA += 1
else:
FQ = 'B'
else:
if random.random() < B:
scoreB += 1
else:
FQ = 'A'
return scoreA,scoreB
def Gameover(scoreA,scoreB):
return scoreA == 15 or scoreB == 15
def Printsumary(winsA,winsB):
N = winsA + winsB
print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))
def main():
PrintIntro()#打印基本的介绍性信息
A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
winsA,winsB = simGames(n,A,B)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次
Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率
if __name__ == '__main__':
main()
这是一个python竞技体育的小项目
用来模拟两个运动员进行比赛,从而估算出胜率
运动员A和运动员B的能力值在0-1之间
请输入运动员A的能力值:0.65
请输入运动员B的能力值:0.68
请输入比赛的总回合数:10000
运动员A获胜的总场次为4664,胜率为46.6%
运动员B获胜的总场次为5336,胜率为53.4%
做这个题的时候我也出现了问题,就是函数调用参数的问题,一定要按照先后顺序调用,或者直接标出变量传递也可以。
可以简化一些去掉gameover()函数:
import random
def PrintIntro():
print('这是一个python竞技体育的小项目')
print('用来模拟两个运动员进行比赛,从而估算出胜率')
print('运动员A和运动员B的能力值在0-1之间')
def getInput():
A = eval(input('请输入运动员A的能力值:'))
B = eval(input('请输入运动员B的能力值:'))
n = eval(input('请输入比赛的总回合数:'))
return A,B,n
def simGames(n,A,B):
winsA,winsB = 0,0
for i in range(n):
scoreA,scoreB = simoneGames(A,B)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsB
def simoneGames(A,B):
scoreA,scoreB = 0,0
FQ = 'A'
if scoreA != 15 or scoreB != 15:
if FQ == 'A':
if random.random() < A:
scoreA += 1
else:
FQ = 'B'
else:
if random.random() < B:
scoreB += 1
else:
FQ = 'A'
return scoreA,scoreB
def Printsumary(winsA,winsB):
N = winsA + winsB
print('运动员A获胜的总场次为{},胜率为{:0.1%}'.format(winsA,winsA/N))
print('运动员B获胜的总场次为{},胜率为{:0.1%}'.format(winsB,winsB/N))
def main():
PrintIntro()#打印基本的介绍性信息
A,B,n = getInput()#获得参数,其中A为运动员A的能力值,B为运动员B的能力值,n为双方一共打的回合数
winsA,winsB = simGames(n,A,B)#winsA是运动员A获胜的总场次,winsB是运动员B获胜的总场次
Printsumary(winsA,winsB)#打印出每个运动员获胜的场次及胜率
if __name__ == '__main__':
main()