• 关于预测比赛结果


    今天给各位介绍如何用Python编写一段预测比赛结果的代码

    以排球比赛为例

    首先介绍一下排球比赛的规则

    前四场采用25分制,每场比赛只有到某支队伍先取得25分并且比对手至少高三分才算获得本局胜利;

    正式比赛采用五局三胜制,最后的决赛局只采用15分制,当其中一队先得满8分以后,双方交换场地,按原位置继续进行比赛

    决胜局的优胜条件为先取得15分及15分以上且比对手得分高2分以上的队伍获胜

    我设计了如下程序

    # -*- coding: utf-8 -*-
    """
    Created on Wed May 15 15:43:44 2019
    
    @author: h2446
    """
    
    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("模拟比赛的场次:"))
        return a,b,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 gameOver(a,b):
            if (a>25 and abs(a-b)>=2 )or(b>25 and abs(a-b)>=2):
                return True
            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 final(probA,probB):
         winsA,winsB=simNGames1(4,probA,probB)
         printSummary(winsA,winsB)
         if not winsA==3 or winsB==3:
             if winsA==winsB==2:
                 winsA1,winsB1=simOneGame1(probA,probB)
                 finalprintSummary(winsA,winsB)
         else:
             finalprintSummary(winsA,winsB)
    def simNGames1(n,probA,probB):
         winsA,winsB=0,0
         for i in range(n):
             scoreA,scoreB=simOneGame2(probA,probB)
             if winsA==3 or winsB==3:
                 break
             if scoreA>scoreB:
                 winsA+=1
             else:
                 winsB+=1
         return winsA,winsB
    def simOneGame2(probA,probB):
         scoreA,scoreB=0,0
         serving="A"
         while not GG(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 simOneGame1(probA,probB):
        scoreA,scoreB=0,0
        serving="A"
        while not finalGameOver(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 GG(a,b):
        return a==3 or b==3
    def finalGameOver(a,b):
         if (a==8 or b==8):
             if a>b:
                 print("A队获得8分,双方交换场地")
             else:
                 print("B队获得8分,双方交换场地")
         if (a>15 and abs(a-b)>=2 )or(b>15 and abs(a-b)>=2):
             return True
         else:
             return False
    def finalprintSummary(winsA,winsB):
         n=winsA+winsB
         if n>=4:
             print("进行最终决赛")
             if winsA>winsB:
                 print("最终决赛由A获胜")
             else:
                 print("最终决赛由B获胜")
         else:
                if winsA>winsB:
                    print("最终决赛由A获胜")
                else:
                    print("最终决赛由B获胜")
    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 main():
            printIntro()
            probA,probB,n=getInputs()
            winsA,winsB=simNGames(n,probA,probB)
            printSummary(winsA,winsB)
            final(probA,probB)
    main()

    运行结果为

    以上的便是今天的学习

  • 相关阅读:
    CentOS ping www.baidu.com 报错 name or service not know
    python2 当中 遇到 UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 37: ordinal not in range(128)
    shell基本语法
    android---笔记 AppContext extends Application
    android笔记--加载框
    android笔记--与服务器交互更改简历状态
    android笔记---AndroidManifest.xml
    android笔记-----消息提示
    ios笔记一 追加数据
    android笔记一 控件属性
  • 原文地址:https://www.cnblogs.com/wumaiqiti1020/p/10870323.html
Copyright © 2020-2023  润新知