目录
问题分析
自顶向下和自底向上
体育竞技分析总体框架及步骤
举一反三
体育竞技分析
模拟N场比赛
比赛规则
自顶向下
自底向上
#体育竞技分析
import random
def printInfo():
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 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 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 simOneGame(probA, probB):
scoreA, scoreB = 0, 0;
serving = "A"; #A先发球
while not gameOver(scoreA, scoreB): #not False 等于 True
if serving == "A":
if random.random() < probA:
scoreA += 1;
else:
serving = "B";
else:
if random.random() < probB:
scoreB += 1;
else:
serving = "A";
return scoreA, scoreB;
#返回bool值
def gameOver(a, b):
return a == 15 or b == 15;
def main():
printInfo();
probA, probB, n = getInputs();
winsA, winsB = simNGames(n, probA, probB);
printSummary(winsA, winsB);
main();
#运行结果
这个程序模拟两个选手A和B的某种竞技比赛
程序运行需要A和B的能力值(以0到1之间的小数表示)
请输入选手A的能力值(0-1):0.45
请输入选手B的能力值(0-1):0.50
模拟比赛的场次:1000
竞技分析开始,共模拟1000场比赛
选手A获胜376场比赛,占比37.6%
选手B获胜624场比赛,占比62.4%
理解自顶向下和自底向上
应用问题的扩展
本文仅为学习Python记录,资料来源于中国大学MOOC《Python语言设计》—嵩天