深度之眼–6.2函数编程实例–羽毛球比赛
"""
问题抽象:
1、在小丹vs小伟的二元比赛系统中,小丹每球获胜概率55%,小伟每球获胜概率45%
2、每局比赛,先赢球21(21分)者获胜
3、假设进行n=10000场独立的比赛,小丹会获胜多少场?
"""
import random
def get_inputs():
prob_A = eval(input("请输入运动员A的每球获胜概率(0~1):"))
prob_B = round(1-prob_A, 2)
number_of_games = eval(input("请输入模拟的场次(正整数):"))
print("模拟比赛总次数:", number_of_games)
print("A选手每球获胜概率, ", prob_A)
print("B选手每球获胜概率, ", prob_B)
return prob_A, prob_B, number_of_games
def game_over(score_A, score_B):
return score_A == 21 or score_B == 21
def sim_one_game(prob_A, prob_B):
score_A, score_B = 0, 0
while not game_over(score_A, score_B):
if random.random() < prob_A:
score_A += 1
else:
score_B += 1
return score_A, score_B
def sim_n_games(prob_A, prob_B, number_of_games):
win_A, win_B = 0, 0
for i in range(number_of_games):
score_A, score_B = sim_one_game(prob_A, prob_B)
if score_A > score_B:
win_A += 1
else:
win_B += 1
return win_A, win_B
def print_summary(win_A, win_B, number_of_games):
print("共模拟了{}场比赛".format(number_of_games))
print("选手A获胜{0}场,占比{1:.1%}".format(win_A, win_A / number_of_games))
print("选手B获胜{0}场,占比{1:.1%}".format(win_B, win_B / number_of_games))
def main():
prob_A, prob_B, number_of_games = get_inputs()
win_A, win_B = sim_n_games(prob_A, prob_B, number_of_games)
print_summary(win_A, win_B, number_of_games)
if __name__ == '__main__':
main()