Python程序设计思维练习---体育竞技分析

  • 体育竞技分析:模拟N场比赛
  • 计算思维:抽象 + 自动化
  • 模拟:抽象比赛过程,自动模拟N场比赛,当N越大时,比赛结果分析越科学。
  • 本次比赛规则:回合制,15分一局,先由一方发球,如胜利,则得1分并继续发球,如失败,则双方分数不改变并交换球权。球员AB的能力为0-1之间的一个数值

思维方式:自顶向下即将一个复杂问题分解成几个问题,再细分成一个个具体的小问题,从而来解决复杂问题。自底向上为自顶向下的逆过程,即解决复杂问题的方法,逐步解决一个个小问题,来达成目的。


1.将体育竞技分析分解为以下几个小步骤

1.1打印程序的介绍性信息式
1.2获得程序运行参数:probA(A的能力值),probB(B的能力值),n(比赛场次)
1.3利用球员AB的能力值,模拟n场比赛
1.4输出球员AB获胜的场次及概率

2.将各个步骤定义成函数来实现

Python程序设计思维练习---体育竞技分析_第1张图片

分解

Python程序设计思维练习---体育竞技分析_第2张图片

定义函数

3.完整代码

from random 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 simOneGame(probA, probB):    # 进行一场比赛
    scoreA, scoreB = 0, 0   # 初始化AB的得分
    serving = 'A'         # 首先由A发球
    while not gameOver(scoreA, scoreB):  #用while循环来执行比赛
        if serving == 'A':
            if random() < probA:   # random() 方法返回随机生成的一个实数,它在[0,1)范围内。
                scoreA += 1     # 用随机数来和能力值比较从而分出胜负
            else:
                serving = 'B'
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving = 'A'
    return scoreA, scoreB

def simNGames(n, probA, probB):    #进行N场比赛
    winsA, winsB = 0, 0    # 初始化AB的胜场数
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB

def gameOver(c, d):    #比赛结束
    return c==15 or d==15

def printSummary(n ,winA, winB):    #打印比赛结果
    print('竞技分析开始,共模拟{}场比赛'.format(n))
    print('选手A获胜{}场比赛,占比{:.2f}%'.format(winA, winA/n*100))
    print('选手B获胜{}场比赛,占比{:.2f}%'.format(winB, winB / n * 100))
def main():
    printInfo()
    probA, probB, n =getInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(n, winsA, winsB)

main()

4.运行结果分析

Python程序设计思维练习---体育竞技分析_第3张图片

菜鸟互啄

Python程序设计思维练习---体育竞技分析_第4张图片

中阶对抗

Python程序设计思维练习---体育竞技分析_第5张图片

皇城PK

分析以上数据得知:对于两位能力相差相同的选手(都为0.05),能力越大的选手竞技时,胜负概率越接近。

本练习来自中国大学MOOC

你可能感兴趣的:(Python学习笔记)