圣者
精华
|
战斗力 鹅
|
回帖 0
注册时间 2005-8-12
|
本帖最后由 Tring 于 2023-11-26 23:57 编辑
其实问题只和1个参数有关:
不算触发回蓝,只算基础回蓝,从满蓝到打空实际上能够连发多少发魔法。
基础情况记为n1次打空蓝,修正情况记为n2次打空蓝。
概率计算部分是真的挺纠结的。
为了让这个问题能够更直观的思考,把问题稍微转换一下:
投M次硬币,不出现N次连续正面的概率(正反面概率不等),记为P1(M, N)。
令单次出现正面的概率为P。
投M+1+N次硬币,刚好最后N次为正面,前M次不出现连续N次正面,而第M+1次刚好是翻面,的概率为:
P2(M+N+1, N) = P1(M, N) * (1-P) * P ^ N (式1)
而投M次硬币,出现N次连续正面的概率(1-P(M)),实际可以写作每一位结尾刚好出现N次连续正面的概率之和:
1-P1(M) = P2(M, N) + P2(M-1, N) + ... + P2(N, N) (式2)
把式1调整参数,可以得到:
P2(M, N) = P1(M - N - 1, N) * (1-P) * P ^ N (M > N)
P2(N, N) = P ^ N
P2(M, N) = 0 (M < N)
到这里为止能手算的部分就差不多了,后面就是超纠结的递归了。
就算用sympy符号计算,结果多项式展开也杂到没法看。因此直接上数值计算了。
直接用P2与打空蓝的次数n相乘求得实际多少次打空蓝。
- #! python3
- # coding: utf-8
- _cch = {}
- def cch(nm):
- if nm in _cch:
- _c = _cch[nm]
- else:
- _c = {}
- _cch[nm] = _c
- def _mod(func):
- def _wrap(*args):
- if args in _c:
- return _c[args]
- r = func(*args)
- _c[args] = r
- return r
- return _wrap
- return _mod
- # prob of M coins, NO consecutive N heads
- @cch('nc')
- def pr_nc(m, n, p):
- ps = 0
- for i in range(n, m+1):
- ps += pr_lc(i, n, p)
- return 1 - ps
- # prob of M coins, 1 tail and N heads at last
- @cch('lc')
- def pr_lc(m, n, p):
- if m < n:
- return 0
- elif m == n:
- return p ** n
- else:
- return pr_nc(m - n - 1, n, p) * (1 - p) * p ** n
- def calc_exp(m, n, p):
- s = 0
- d = 0
- for i in range(0, m+1):
- d = pr_lc(i, n, p) * i
- s += d
- assert d < 0.001
- return s
- if __name__ == '__main__':
- from matplotlib import pyplot as plt
- def draw(n1, n2, ax, mx=300, p = 0.95):
- xs = []
- ys1 = []
- ys2 = []
- k = n1 / n2
- for x in range(n1 * 2):
- xs.append(x)
- y1 = x * k
- y2 = calc_exp(mx, x, p)
- ys1.append(y1)
- ys2.append(y2)
- if x > 0 and abs(y1 - y2) < 1e-2:
- cy = y2
- cx = x
- ax.plot(xs, ys1)
- ax.plot(xs, ys2)
- ax.plot([0, n2, n2], [n1, n1, 0], ':')
- ax.plot([0, cx, cx], [cy, cy, 0], ':')
- ax.legend(['n1', 'n2'])
- ax.set_ylabel('n real')
- ax.set_xlabel('n2')
- def main():
- fig, axs = plt.subplots(1)
- draw(12, 10, axs)
- plt.show()
- plt.cla()
- main()
复制代码
草草的拿基础12次打空蓝,修正后不回蓝10次打空蓝来计算,
可以看到实际上只要蓝条能撑过6次以上(这个数值会随着实际上打空蓝的次数比变化,因为有基础回蓝所以并不是准确1.2倍,但是趋势不会变化),
就是修正后几率回蓝的情况打空蓝的期望次数更高。
而且随着蓝条能打的发数增加,这个优势还会更加明显。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|