Python-体育竞技分析

目录

问题分析

自顶向下和自底向上

体育竞技分析总体框架及步骤

举一反三


问题分析

体育竞技分析

  • 需求:毫厘是多少?如何科学分析体育竞技比赛?
  • 输入:球员的水平
  • 输出:可预测的比赛成绩

模拟N场比赛

  • 计算思维:抽象 + 自动化
  • 模拟:抽象比赛过程 + 自动化执行N场比赛
  • 当N越大时,比赛结果分析会越科学

比赛规则

  • 双人击球比赛:A & B,回合制,5局3胜
  • 开始时一方先发球,直至判分,接下来胜者发球
  • 球员只能在发球局得分,15分胜一局 (为什么? 发球的时候随机能力值大小来判定是否得分

自顶向下和自底向上

自顶向下

  • 解决复杂问题的有效方法
  • 将一个总问题表达为若干个小问题组成的形式
  • 使用同样的方法进一步分解小问题
  • 直至,小问题可以用计算机简单明了的解决

自底向上

  • 分单元测试,逐步组装
  • 按照自顶向下相反的路径操作
  • 直至,系统各部分以组装的思路都经过测试和验证

体育竞技分析总体框架及步骤

  • 步骤1: 打印程序的介绍性信息  printInfo()
  • 步骤2: 获得程序运行参数:probA,probB,n getInputs()
  • 步骤3:利用球员A和B的能力值,模拟n局比赛 simNGames()
  • 步骤4:输出球员A和B获胜比赛的场次机概率 printSummary()

#体育竞技分析
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语言设计》—嵩天

猜你喜欢

转载自blog.csdn.net/cheng6023/article/details/102560593