深度之眼

深度之眼–6.2函数编程实例–羽毛球比赛

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
"""
问题抽象:1、在小丹vs小伟的二元比赛系统中,小丹每球获胜概率55%,小伟每球获胜概率45%2、每局比赛,先赢球21(21分)者获胜3、假设进行n=10000场独立的比赛,小丹会获胜多少场?
"""
import randomdef 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_gamesdef game_over(score_A, score_B):# 单场模拟结束条件:一方先达到21分,比赛结束return score_A == 21 or score_B == 21def sim_one_game(prob_A, prob_B):# 模拟一场比赛的结果score_A, score_B = 0, 0while not game_over(score_A, score_B):if random.random() < prob_A:score_A += 1else:score_B += 1return score_A, score_Bdef sim_n_games(prob_A, prob_B, number_of_games):# 模拟多长比赛的结果win_A, win_B = 0, 0for i in range(number_of_games):score_A, score_B = sim_one_game(prob_A, prob_B)if score_A > score_B:win_A += 1else:win_B += 1return win_A, win_Bdef 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()