但凡早发一天,米哈游都得V我50
问题:
求160抽获得至少5金且至少3UP的概率
先上结论
160抽获得至少5金的概率: 0.007479885414129266, 即: 0.748%
160抽获得至少5金且至少3UP的概率: 0.006665135461820355, 即: 0.6665%

以下是python代码
'''
问题:
160抽获得至少5金且至少3UP的概率P
思路:
P0 = 160抽5金的概率
P1 = 5金中至少有3个UP的概率
P2 = 160抽至少6金的概率 此时必然至少有3UP
P = P0 * P1 + P2
利用概率矩阵递推的方法
先计算P0, P2
再计算P1
'''
import numpy as np
# 计算连续n抽未出金时,下一抽出金的概率
# 第74抽就是连续73抽未出金,n=73
# 第90抽就是连续89抽未出金,n=89
def getP(n):
if n < 73:
return 0.006
else:
p = 0.006 + (n - 72) * 0.06
p = 1 if p > 1 else p
return p
'''
计算P0和P2
P0 = 160抽5金的概率
P2 = 160抽至少6金的概率
'''
# 3维概率矩阵,每个维度为a,b,c,表示在当前情况下的概率
# a为已经抽取次数
# b为连续未出金抽数
# c为已经出金个数(c==6时,表示金个数>=6,在计算的时候需要注意)
# 则 160抽5金的概率 P0 = sum(X[160, :, 5])
# 则 160抽6金及以上的概率 P1 = sum(X[160, :, 6:])
A = 160
B = 90
C = 5
X = np.zeros((A+1, B, C+2), dtype=float)
# 递推
X[0][0][0] = 1
for a in range(A):
for b in range(B):
if b > a:
break
for c in range(C+2):
# 出金
if c == C+1: # c==6时,表示金个数>=6,所以出金后c仍然为6
X[a+1][0][c] += X[a][b][c] * getP(b)
else:
X[a+1][0][c+1] += X[a][b][c] * getP(b)
# 没出
if b < B - 1:
X[a+1][b+1][c] += X[a][b][c] * (1 - getP(b))
# 160抽5金的概率
P0 = sum(X[160, :, 5])
# 160抽6金及以上的概率 此时必然至少有3UP
P2 = sum(sum(X[160, :, 6:]))
print(f"160抽出5金概率: {P0}, 即{P0*100:.4}%")
print(f"160抽出6金及以上概率: {P2}, 即{P2*100:.4}%")
'''
计算P1
P1 = 5金中至少有3个UP的概率
'''
# 3维概率矩阵,每个维度为c,d,e,表示在当前情况下的概率
# c为已经出金个数(c==6时,表示金个数>=6,在计算的时候需要注意)
# d为连续非UP个数
# e为已经出UP个数
D = 2
E = 3
X = np.zeros((C+1, D, E+1), dtype=float)
# 递推
X[0][0][0] = 1
for c in range(C):
for d in range(D):
if d > c:
break
for e in range(E+1):
# UP概率
p = 0.5 if d == 0 else 1
# UP
if e == E: # e==3时,表示UP个数>=3
X[c+1][0][e] += X[c][d][e] * p
else:
X[c+1][0][e+1] += X[c][d][e] * p
# 非UP
if d == 0:
X[c+1][d+1][e] += X[c][d][e] * 0.5
P1 = sum(X[5, :, 3])
print(f"5金且至少3UP的概率: {P1}, 即{P1*100:.4}%")
# 160抽获得至少5金且至少3UP的概率P
P = P0 * P1 + P2
print()
print(f"160抽获得至少5金的概率: {P0 + P2}, 即: {(P0 + P2)*100:.4}%")
print(f"160抽获得至少5金且至少3UP的概率: {P}, 即: {P*100:.4}%")


