乒乓规则分析

乒乓竞技模拟比赛的规则为:

一局比赛:
在一局比赛中,先得11分的一方为胜方;10平后,先多得2分的一方为胜方。
一场比赛:
单打的淘汰赛采用七局四胜制,双打淘汰赛和团体赛采用五局三胜制。

该问题的IPO描述如下:

输入:两个球员:A和B的得分的概率,比赛的次数

处理:模拟比赛过程

输出:A和B分别赢的概率

自顶向下的设计如下:

def main():
    printIntro()
    probA,probB,n=getInputs()
    winsA,winsB=simNGames(n,probA,probB)
    printSummary(winsA,winsB,n)

其中 printIntro()为程序的介绍性信息,getInputs()为程序运行需要的参数,simNGames(n,probA,probB)依据proA,proB进行n次比赛,printSummary(winsA,winsB,n)输出A和B的赢的概率。

它们分别为:

def printIntro():
    print("这个程序模拟两个选手A和B的乒乓比赛")
    print("这个程序需要A和B的能力值(0-1)")
    print("分析员:01")
def getInputs():
    a=eval(input(‘A的能力值为:‘))
    b=eval(input("B的能力值为:"))
    n=eval(input("比赛的场次为:"))
    return a,b,n
def simNGames(n,probA,probB):
    a,b=0,0
    for i in range(n):
        x,y=ones(probA,probB)
        if x>y:
            a+=1
        else:
            b+=1
    return a,b
def printSummary(a,b,n):
    print("A赢{}          B赢{}          共{}".format(a,b,n))
    print("A赢的概率为{:0.1%} B赢的概率为{:0.1%}".format(a/n,b/n))

想要算出n场的A和B赢的次数,需要求出一场比赛A和B分别赢了几局,由ones(probA,probB)求得

def ones(probA,probB):
    wa,wb=0,0
    for j in range(7):
        xa,xb=one(probA,probB)
        if xa>xb:
            wa+=1
        else:
            wb+=1
    return wa,wb

求A和B在一场比赛中的赢的局数,需要求出一局中A和B的得分,由one(probA,probB)求得

def one(a,b):
    scorea,scoreb=0,0
    x=‘A‘
    while not gameover(scorea,scoreb):
        if x==‘A‘:
            if random()<a:
                scorea+=1
            else:
                x=‘B‘
        else:
            if random()<b:
                scoreb+=1
            else:
                x=‘A‘
    return scorea,scoreb

在其中需要有结束的条件gameover(scorea,scoreb)

def gameover(a,b):
    if a>=10 and b>=10 and abs(a-b)==2:
        return True
    if (a>=11 and b<11) or (a<11 and b>=11):
        return True
    return False

完整的代码如下:

from random import random
def printIntro():
    print("这个程序模拟两个选手A和B的乒乓比赛")
    print("这个程序需要A和B的能力值(0-1)")
    print("分析员:01")
def getInputs():
    a=eval(input(‘A的能力值为:‘))
    b=eval(input("B的能力值为:"))
    n=eval(input("比赛的场次为:"))
    return a,b,n
def gameover(a,b):
    if a>=10 and b>=10 and abs(a-b)==2:
        return True
    if (a>=11 and b<11) or (a<11 and b>=11):
        return True
    return False
def one(a,b):
    scorea,scoreb=0,0
    x=‘A‘
    while not gameover(scorea,scoreb):
        if x==‘A‘:
            if random()<a:
                scorea+=1
            else:
                x=‘B‘
        else:
            if random()<b:
                scoreb+=1
            else:
                x=‘A‘
    return scorea,scoreb
def ones(probA,probB):
    wa,wb=0,0
    for j in range(7):
        xa,xb=one(probA,probB)
        if xa>xb:
            wa+=1
        else:
            wb+=1
    return wa,wb
def simNGames(n,probA,probB):
    a,b=0,0
    for i in range(n):
        x,y=ones(probA,probB)
        if x>y:
            a+=1
        else:
            b+=1
    return a,b
def printSummary(a,b,n):
    print("A赢{}          B赢{}          共{}".format(a,b,n))
    print("A赢的概率为{:0.1%} B赢的概率为{:0.1%}".format(a/n,b/n))
def main():
    printIntro()
    probA,probB,n=getInputs()
    winsA,winsB=simNGames(n,probA,probB)
    printSummary(winsA,winsB,n)
main()

输入0.55 0.54 500的结果为

这个程序模拟两个选手A和B的乒乓比赛
这个程序需要A和B的能力值(0-1)
分析员:01

A的能力值为:0.55

B的能力值为:0.54

比赛的场次为:500
A赢347          B赢153        共500
A赢的概率为69.4% B赢的概率为30.6%

原文地址:https://www.cnblogs.com/13128870440-zxy/p/10849096.html

时间: 2024-11-09 06:19:44

乒乓规则分析的相关文章

android中SELINUX规则分析和语法简介

############################################# 本文为极度寒冰原创,转载请注明出处 ############################################# 1. SELINUX是可以理解为一种android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强系统 我们可以通过配置SELINUX的相关policy,来定制自己的手机的一些权限,比如,我们可以完全让root用户没有任何的权限和user一样 2.

Openstack 中的防火墙规则分析

上周花了几天研究了一下Openstack的Security Group防火墙规则,总结下上周的成果. 一.介绍下我的环境. 操作系统:RHEL6.4+Openstack官方内核 Openstack版本:Havana 网络模式:ML2+Linuxbridge 租户网络:VLAN 二.Iptables 流向 INPUT neutron-linuxbri-INPUT neutron-linuxbri-o45d1d6e0-d neutron-linuxbri-s45d1d6e0-d neutron-li

根据业务规则分析业务对象,然后生成表结构

在软件开发过程中, 一定会遇到的问题是根据业务规则来分析业务对象间的关系来生成数据库表,而后才能进行后续开发, 前期充分的业务对象关系分析和表设计会大大提高开发效率,缩短项目开发时间, 避免冗余作业,避免返工,大大提升工作幸福感. 前提: 业务比较复杂(ps: 简单业务就不必要建筑工具或者图标来帮助你缕清思路算了, 直接写代码吧) 先简略记下: 1. 首先仔细分析业务规则, 根据业务规则画出业务对象关系图(工具: visio等)如下: 对象关系图: 2. 然后根据业务对象关系图设计表关系图(工具

XHTML标签的嵌套规则分析

在 XHTML 的语言里,我们都知道:ul 标签包含着 li.dl 标签包含着 dt 和 dd——这些固定标签的嵌套规则十分明确.但是,还有许多标签是独立的,它们没有被捆绑在一起,比如 h1.div.p……那么这些标签的嵌套规则到底是怎样的?今天就来说说这个话题. 提到 XHTML 标签的嵌套规则,我们先得知道有这么二类 XHTML 标签,一类叫做 块级元素(block),一类叫做 内嵌元素(inline,也有许多人叫它:内联.行内.线级等). 块级元素 和 内嵌元素 的划分标准很简单,请把下面

【漏洞分析】Heartbleed 2014-0160漏洞Poc及规则分析

HeartBleed Poc脚本 1.发送client hello接收serverhello 之后发送心跳再解析获取的数据信息 2.发送client hello时直接带上心跳消息,然后解析服务器返回信息 #!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford ([email protected]) # Modified by Derek Callaway ([email protec

CSDN博文“待定”如何避免检测规则分析“待定”

这些天一直很郁闷.鲍文本人一直"待定", 当然,这是非常不舒服的自己.那么今晚最终成为一个非成功出版"待定"文章,这CSDN于大家的反映而放弃了.没想到我后面又測了一篇文章.结果还是"待审核".这让一向喜欢专研的我有了想探究原因的冲动.说干就干. 于是复制粘贴以前被归为"待审核"的文章,并发表,自然而然还是"待审核".然后就不停的删除一些内容.最后最终成功发表. 事实上这个測试过程和调试bug一样.不停加入

转:【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17348313 happen-before规则介绍 Java语言中有一个"先行发生"(happen-before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,"影响"包括修改了内存中共享变量的值.发送了消息.调用了方法等,它与时间上的先后发生基本没有

【Java并发编程】之十六:深入Java内存模型——happen-before规则及其对DCL的分析(含代码)

happen-before规则介绍 Java语言中有一个"先行发生"(happen-before)的规则,它是Java内存模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,其意思就是说,在发生操作B之前,操作A产生的影响都能被操作B观察到,"影响"包括修改了内存中共享变量的值.发送了消息.调用了方法等,它与时间上的先后发生基本没有太大关系.这个原则特别重要,它是判断数据是否存在竞争.线程是否安全的主要依据. 举例来说,假设存在如下三个线程,分别执行对应

第3阶段——内核启动分析之make uImage编译内核(3)

目标: 通过分析makefile,明白make uImage如何编译内核 把整个内核的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/build/makefiles.txt) <1>各级子目录makefile(每个子目录都有makefile)<2>/arch/arm/Makefile(架构相关的makefile)<3>顶层目录makefile 在顶层目录makefile中auto.conf和/arch/arm