zoukankan      html  css  js  c++  java
  • 体育竞技分析

    • 体育竞技分析:模拟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获胜的场次及概率

      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()

      羽毛球比赛

    • from random import random
      def printIntro():
          
          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("模拟比赛的场次: "))
          m = eval(input("模拟次数:"))
          return a, b, n, m
      def simNGames(n, probA, probB):
          winsA, winsB = 0, 0
          scoreA_ls=[]
          scoreB_ls=[]
          for i in range(n):
              scoreA, scoreB = simOneGame(probA, probB)
              scoreA_ls.append(scoreA)
              scoreB_ls.append(scoreB)
              if scoreA > scoreB:
                  winsA += 1
              else:
                  winsB += 1
          return winsA, winsB,scoreA_ls,scoreB_ls
      def gameOver(a,b):
          if(a>=20 or b>=20):
              if(abs(a-b)==2 and a<=29 and b<=29):
                  return True
              else:
                  return a==30 or b==30
          else:
              return False
      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,m,scoreA_ls,scoreB_ls):
          n = winsA + winsB
          print("模型模拟次数{}".format(m))
          print("竞技分析开始,共模拟{}场比赛".format(n))
          print("A选手各场次得分比分:")
          print(scoreA_ls)
          print("B选手各场次得分比分:")
          print(scoreB_ls)
          print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
          print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
      def main():
          printIntro()
          probA, probB, n, m= getInputs()
          for i in range(m):
              winsA, winsB,scoreA_ls,scoreB_ls = simNGames(n, probA, probB)
          printSummary(winsA, winsB,m,scoreA_ls,scoreB_ls)
          
      main()

  • 相关阅读:
    [LeetCode] 294. Flip Game II 翻转游戏之二
    [LeetCode] 293. Flip Game 翻转游戏
    [LeetCode] 266. Palindrome Permutation 回文全排列
    [LeetCode] 288. Unique Word Abbreviation 独特的单词缩写
    [LeetCode] Self Crossing 自交
    [LeetCode] 281. Zigzag Iterator 之字形迭代器
    [LeetCode] 251. Flatten 2D Vector 压平二维向量
    [LeetCode] 250. Count Univalue Subtrees 计数相同值子树的个数
    [LeetCode] 249. Group Shifted Strings 群组偏移字符串
    [LeetCode] 248. Strobogrammatic Number III 对称数之三
  • 原文地址:https://www.cnblogs.com/hzxxxb/p/10891148.html
Copyright © 2011-2022 走看看