181117 Python学习日记——体育竞技模拟(自顶向下计算思维)

纪录的第二天,写写自己这两天学了些什么吧。
今日金句:

3:22	我们不至消灭、是出于耶和华诸般的慈爱、是因他的怜悯、不至断绝。
3:23	每早晨这都是新的.你的诚实、极其广大。 

体育竞技模拟,题目如下:
回合制,先由一方发球,如胜利,则得1分并继续发球,如失败,则双方分数不改变并交换球权。球员AB的能力为0-1之间的一个数值

#INPUT
def InputIntro():
    print('这个程序模拟两个选手A和B之间的竞技比赛')
    print('这个程序需要输入A,B两个选手的能力值')
def Process(n,winA,winB):
    import random
    serving = winA
    scoreA = 0;scoreB = 0;i = 0
    a = random.random()
    while i < n+1:
        if a < winA:
            scoreB += 1
            serving = winB
        else:
            scoreA += 1
        i += 1
        a = random.random()
 #Output
    print('竞技比赛开始,共模拟{}次回合'.format(n))
    print('A选手获胜场次为{},占比{}'.format(scoreA,scoreA/n))
    print('B选手获胜概率为{},占比{}'.format(scoreB,scoreB/n))
InputIntro()
Process(1000,0.45,0.47)

输出结果如下:

这个程序模拟两个选手A和B之间的竞技比赛
这个程序需要输入A,B两个选手的能力值
竞技比赛开始,共模拟1000次回合
A选手获胜场次为526,占比0.526
B选手获胜概率为475,占比0.475

对于先达到某分数即判定胜利的比赛,可对代码作出如下修改

def InputIntro():
    print('这个程序模拟两个选手A和B之间的竞技比赛')
    print('这个程序需要输入A,B两个选手的能力值')
    print('先达到15分即获胜')
def Process(score,winA,winB):
    import random
    serving = winA
    scoreA = 0;scoreB = 0;i = 0
    a = random.random()
    while scoreA < score and scoreB < score:
        if a < winA:
            scoreB += 1
            serving = winB
        else:
            scoreA += 1
        i += 1
        a = random.random()
    print('竞技比赛开始,共进行了{}次回合'.format(i))
    print('A选手得分为{}'.format(scoreA))
    print('B选手得分为{}'.format(scoreB))
    if scoreA > scoreB:
        print('获胜者为A')
    else:
        print('获胜者为B')
InputIntro()
Process(15,0.45,0.47)

运行结果如下:

这个程序模拟两个选手A和B之间的竞技比赛
这个程序需要输入A,B两个选手的能力值
先达到15分即获胜
竞技比赛开始,共进行了19次回合
A选手得分为15
B选手得分为4
获胜者为A

再运行一次:

这个程序模拟两个选手A和B之间的竞技比赛
这个程序需要输入A,B两个选手的能力值
先达到15分即获胜
竞技比赛开始,共进行了24次回合
A选手得分为15
B选手得分为9
获胜者为A

这里还有一点小思考,在得到A,B的分数后,我用的是if做判断,比较后手动输出获胜者信息。
但如果用序列,字典或列表把A,B的分数形成一定的对应关系,则可用函数,如

dic = {'A':scoreA,'B':scoreB}
items = list(dic.items())
dic.sort(key = lambda x:x[1])
print(items[0])

这个地方应该还是有更简单的方法,关于字典的遍历。
有兴趣可以研究下字典适用的排序方式,sort(),sorted()等等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值