题目:赛制规定:
前四局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方3分时,才胜一局。
正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序比赛到结束。
在决胜局(第五局)之比赛,先获15分并领先对方2分为胜。
该问题的IPO描述如下:
输入:两个球员(球员A和球员B)的能力概率,模拟比赛的场次
处理:模拟比赛过程
输出:球员A和B分别赢得球赛的概率
程序如下:
# -*- encoding:utf-8 -*- ''' 模拟排球竞技 @author: bpf ''' # 比赛规则: # 1. 采用5局3胜制 # 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局 # 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜
from random import random def printInfo(): ''' 打印程序的功能信息 ''' print("\t\t这个程序模拟2个队伍A和B的排球竞技比赛!") print("\t 程序运行需要队伍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 NGames(n, probA, probB): ''' 模拟n场比赛 ''' winA, winB = 0, 0 for _ in range(n): scoreA, scoreB = OneGame(probA, probB) if scoreA > scoreB: winA += 1 else: winB += 1 return winA, winB
def OneGame(probA, probB): ''' 模拟一场比赛,包括五局 ''' scoreA, scoreB, N = 0, 0, 0 serving = 'A' while not GameOver(N, scoreA, scoreB): if serving == 'A': if random() > probA: scoreB += 1 serving = 'B' else: scoreA += 1 if serving == 'B': if random() > probB: scoreA += 1 serving = 'A' else: scoreB += 1 N += 1 return scoreA, scoreB
def GameOver(N, a, b): ''' 定义赢得一局的条件 N: 当前局次(第五局为决胜局) ''' if N <= 4: return (a>=25 and b>=25 and abs(a-b)>=2) else: return (a>=15 and b>=15 and abs(a-b)>=2)
def printResult(n, winA, winB): print("竞技分析开始,共模拟{}场比赛".format(n)) print("队伍A获胜{}场比赛,占比{:0.1%}".format(winA,winA/n)) print("队伍B获胜{}场比赛,占比{:0.1%}".format(winB,winB/n))
if __name__ == "__main__": printInfo() probA, probB, n = getInputs() winA, winB = NGames(n, probA, probB) printResult(n, winA, winB) |
输出结果:
这个程序模拟两个选手A和B的某种竞技比赛 程序运行需要A和B的能力值(以0到1之间的小数表示)
请输入选手A的能力值:0.45
请输入选手B的能力值:0.6
模拟比赛的场次:4 竞技分析开始,共模拟5场比赛 选手A获胜1场比赛,占比20.0% 选手B获胜4场比赛,占比80.0% |
来源:https://www.cnblogs.com/panqiaoyan/p/10855113.html