排球比赛分析
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()