• 算法题——投篮比赛获胜的概率


      近日,在和他人闲暇无事的时候,进行篮球投篮比赛。由于本人的投篮命中率比较低,而他的投篮命中率比较高。因此,定了一个规则。采用积分制,初始积分为1分。他投篮,每投中一个球,积分加1分,继续投篮;投不中,换我投篮。我投篮,每投中一个球,积分减1分,继续投篮;投不中,换他投篮。若积分到11分,他获胜;若积分减到0分,我获胜。每局由他先投篮。

      在进行若干局的比赛后,各有胜负。提出了一个问题:他获胜的概率是多少?

      

      把问题数字化

      A和B两人进行投篮,A的命中率为70%,B的命中率为30%。初始积分为1分,每人投中继续投,投不中换人投。A投中积分加1分,B投中积分减1分。积分为11分时,A获胜;积分为0分时,B获胜。问:A获胜的概率是多少?

      想到这个问题的时候,没有丝毫头绪。因此采用计算机模拟的方式来计算概率。

      先写了一个函数

      Private Function Winner(ByVal Steps As Integer, ByVal ParamArray P() As Double) As Boolean
        Dim I As Integer = 1, J As Integer = 0
        Do While I > 0 And I < Steps
          If mR.NextDouble < P(J) Then
            I += (-1) ^ J
          Else
            J = 1 - J
          End If
        Loop
        Return (I > 0)
      End Function

      这个函数是模拟一次投篮。如下调用:Winner(11, 0.7, 0.3)。表示A的投篮命中是0.7,B的投篮命中是0.3,积分到11表示A获胜。函数返回True表示A获胜,返回False表示B获胜。

      用了一个循环,模拟1000000局,统计A获胜的局数。得到如下结果:816628。

      又反复执行了9个1000000局,结果如下:816502、815734、816220、816972、816756、816473、816636、816226、816290。可以看出,A获胜的概率大致为81.65%

      如果积分到21分表示A获胜,那么A获胜的概率是多少呢?

      还是上面的代码。模拟1000000局,统计A获胜的局数。执行10次。结果如下:

      816116、816358、816242、816436、816677、816319、815949、815822、815860、816616

      A获胜的概率大致为81.6%。没有想象中的差异那么大。只是略微少了那么一点点。

      那么,如果用数学的计算方法,该如何计算呢?

      

  • 相关阅读:
    Yii2 DetailView小部件
    Yii2 数组助手类arrayHelper
    Yii2 查询构建器 QueryBuilder
    yii2 数据库和ActiveRecord
    Freemake Video Converter视频转换软件下载地址及去广告
    Photoshop独立安装包下载页面
    Photoshop快捷键整理
    json-lib和dom4j实现JSON转XML
    SpringMVC文件上传
    java http 伪造请求头
  • 原文地址:https://www.cnblogs.com/grenet/p/1991153.html
Copyright © 2020-2023  润新知