排球比赛分析

from random import random

def printIntro():
print("这个程序模拟两个选手A和B的排球比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
print("比赛采用5局3胜制,前四局25分,决胜局15分。")
print("学号:04")

def getInputs():
a = eval(input("请输入选手A的能力值(0-1):"))
b = eval(input("请输入选手B的能力值(0-1):"))
n = eval(input("模拟比赛的场次:"))
return a, b, n

def gameOver_set(scoreA, scoreB, setNum):
# 根据是否为决胜局确定目标分数
if setNum == 5:
targetScore = 15
else:
targetScore = 25

# 判断是否达到胜利条件
return (scoreA >= targetScore and scoreA - scoreB >= 2) or \
    (scoreB >= targetScore and scoreB - scoreA >= 2)

def simOneSet(probA_win_point, setNum):
scoreA, scoreB = 0, 0
# 循环直到一局结束
while not gameOver_set(scoreA, scoreB, setNum):
if random() < probA_win_point:
scoreA += 1
else:
scoreB += 1
return scoreA, scoreB

def simOneMatch(probA_win_point):
setsA, setsB = 0, 0
setNum = 1
# 循环直到一方赢得3局
while setsA < 3 and setsB < 3:
scoreA, scoreB = simOneSet(probA_win_point, setNum)
if scoreA > scoreB:
setsA += 1
else:
setsB += 1
setNum += 1
return setsA, setsB

def simNMatches(n, probA, probB):
# 计算A在一分中获胜的概率
probA_win_point = probA / (probA + probB)

winsA, winsB = 0, 0
for i in range(n):
    setsA, setsB = simOneMatch(probA_win_point)
    if setsA > setsB:
        winsA += 1
    else:
        winsB += 1
return winsA, winsB

def printSummary(winsA, winsB):
n = winsA + winsB
print("\n竞技分析开始,共模拟{}场比赛".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 = simNMatches(n, probA, probB)
printSummary(winsA, winsB)

if name == 'main':
main()


posted @ 2025-06-22 18:51  渔樵伴夜归客  阅读(3)  评论(0)    收藏  举报