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

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

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
"""
问题抽象:
    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):
    # 单场模拟结束条件:一方先达到21分,比赛结束
    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()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值