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