zoukankan      html  css  js  c++  java
  • 算法题——投篮比赛获胜的概率

      近日,在和他人闲暇无事的时候,进行篮球投篮比赛。由于本人的投篮命中率比较低,而他的投篮命中率比较高。因此,定了一个规则。采用积分制,初始积分为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%。没有想象中的差异那么大。只是略微少了那么一点点。

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

      

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/grenet/p/1991153.html
Copyright © 2011-2022 走看看