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

    1. 简介: 模拟不同的两个队伍进行排球的模拟比赛。

    2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。

    P 简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本局比赛。

    3. 规则简介:

    ① 每场比赛采用 5局3胜制。

    ② 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局。

    ③ 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜。

    4. 准备就绪,就差代码来实现了

    插入代码之前,先对代码做个简单的介绍:

    printInfo() 打印程序的介绍信息
    getInputs() 获得用户输入的参数
    simNGames(n, probA, probB) 模拟n场比赛
    simOneGame(probA, probB) 模拟一场比赛,包括五局,采取五局三胜制
    simAGame(N, probA, probB) 模拟一局比赛
    GameOver(N, scoreA, scoreB) 定义一局比赛的结束条件
    printResult(n, winsA, winsB) 输出模拟比赛的结果

    行了。直接上代码

    # -*- coding: utf-8 -*-
    """
    Created on Sun May 12 23:15:03 2019
    
    @author: guo'yu'yi
    """
    
    import random
    import os
    def printInfo():
        print("gyy的这个程序模拟两个选手A和B的某种竞技比赛 : ")
        print("需要A和B的能力值(以0到1之间的小数表示):")
    def getInputs():
        proA=eval(input("请输入选手A的能力值(0-1):"))
        proB=eval(input("请输入选手B的能力值(0-1):"))
        n=eval(input("模拟比赛的场次:"))
        return proA,proB,n
    def simNGames(proA, proB, n):
        countA,countB=0,0
        for i in range(n):          
            if SimOneGame(proA, proB)==1:     
                countA+=1
            else:       
                countB+=1
        return countA, countB
    def SimOneGame(proA, proB):
        temp=0.5
        while temp==0.5:
            temp=random.random()
        if temp<0.5:
            serve="A"  
        else:
            serve="B"
        setA,setB=0,0
        while not gameOver(setA,setB):
            scoreA,scoreB=0, 0       
            while not setOver(scoreA, scoreB,setA+setB+1):      
                if serve=="A":
                    if random.random()<proA:      
                        scoreA+=1
                    else:
                        scoreB+=1
                        serve="B"
                else:
                    if random.random()<proB:      
                        scoreB+=1
                    else:
                        scoreA+=1
                        serve="A"
     
            if scoreA>scoreB:
                setA+=1
            else:
                setB+=1
        return (1 if (setA > setB) else 0)
    def setOver(scoreA, scoreB,sets):
        if sets==5:         
            if scoreA>=15 or scoreB>=15:
                if(abs(scoreA-scoreB)>=2):      
                    return True
                else:       
                    return False
            else:
                return False
        else:           
            if scoreA>=25 or scoreB>=25:
                if(abs(scoreA-scoreB)>=2):       
                    return True
                else:
                    return False
            else:       
                return False
    def gameOver(setA,setB):
        if setA==3 or setB==3:      
            return True
        else:
            return False
    def printSummary(countA, countB):
        print("选手A获胜{0}场比赛,占比{1:.2f}%".format(countA, countA/(countA + countB)*100))
        print("选手B获胜{0}场比赛,占比{1:.2f}%".format(countB, countB/(countA + countB)*100))
    if __name__ == "__main__":
        printInfo()
        proA, proB, n = getInputs()
        print("竞技分析开始,共模拟{}场比赛".format(n))
        countA, countB = simNGames(proA, proB, n)
        printSummary(countA, countB)

    结果如下:

    下面是篮球比赛的模拟,这段代码和书上的类似

    # -*- coding: utf-8 -*-
    """
    Created on Tue May 14 19:45:17 2019
    
    @author: guo'yu'yi
    """
    
    from random import *
    def printIntro():
        print("这个程序模拟两个队伍A和B的篮球比赛")
        print("这个程序需要A和B的能力值(0-1)")
    def getInputs():
        a=eval(input('A的能力值为:'))
        b=eval(input("B的能力值为:"))
        n=eval(input("比赛的场次为:"))
        return a,b,n
    def gameover(i,k):
        if i>k:
            return True
        return False
    def one(a,b):
        scorea,scoreb=0,0
        x='A'
        i=1
        k=randint(10,40)
        while not gameover(i,k):
            if x=='A':
                if random()<a:
                    scorea+=2
                else:
                    x='B'
            else:
                if random()<b:
                    scoreb+=2
                else:
                    x='A'
            i+=1
        return scorea,scoreb
    def ones(probA,probB):
        wa,wb=0,0
        for j in range(4):
            xa,xb=one(probA,probB)
            wa+=xa
            wb+=xb
        while wa==wb:
            xa,xb=jiashisai(probA,probB)
            wa+=xa
            wb+=xb
        return wa,wb
    def jiashisai(a,b):
        scorea,scoreb=0,0
        i=1
        x='A'
        while not gameover(i,randint(1,5)):
            if x=='A':
                if random()<a:
                    scorea+=2
                else:
                    x='B'
            else:
                if random()<b:
                    scoreb+=2
                else:
                    x='A'
            i+=1
        return scorea,scoreb
    def simNGames(n,probA,probB):
        a,b=0,0
        for i in range(n):
            x,y=ones(probA,probB)
            if x>y:
                a+=1
            else:
                b+=1
        return a,b
    def printSummary(a,b,n):
        print("A赢了{}场          B赢了{}场          共{}".format(a,b,n))
        print("A赢的概率为{:0.1%} B赢的概率为{:0.1%}".format(a/n,b/n))
    def main():
        printIntro()
        probA,probB,n=getInputs()
        winsA,winsB=simNGames(n,probA,probB)
        printSummary(winsA,winsB,n)
    main()

    结果如下:

  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/gyy-15768200938/p/10864231.html
Copyright © 2011-2022 走看看