如何精确计算桌游战斗平均剩余回合数的数学极限值
桌游战斗平均剩余回合数精确计算方案
问题背景
我在开发桌游赔率计算器时,需要计算单场战斗的平均持续回合数。战斗过程存在双方同时未命中的可能,理论上战斗可以无限持续,无法遍历全部分支路径,必须通过数学极限方法完成计算。
我通过模拟器验证,如下近似函数可以得到接近正确的结果,迭代上限LIMIT取值越大,计算精度越高:
// LIMIT 可取任意数值,取值越大结果精度越高 const LIMIT = 100; // r: 至少一方命中时的剩余回合数 // x: 双方同时未命中的概率,该情况回合数+1,但战斗状态不发生变化 function approximateLimitForNumberOfRounds(r: number, x: number) { let approx = r / (1 - x); // n 趋近于无穷大 for (let n = 1; n < LIMIT; n++) { approx += x ** n; } return approx; }
已知参数x为概率值,取值范围满足0 < x < 1,需要修改上述函数,实现剩余回合数的精确计算,而非近似计算。
实现方案
原近似逻辑本质是计算无穷等比级数的部分和,利用无穷等比级数的闭式求和公式,可以直接得到精确结果,不需要循环迭代。
推导过程
- 代码中循环的作用是计算级数
sum_{n=1}^{LIMIT-1} x^n的部分和。由于约束为0 < x < 1,当n趋近于无穷时x的高次幂会收敛到0,该无穷等比级数(首项为x、公比为x)的精确和为:sum_{n=1}^∞ x^n = x/(1 - x)
- 代入原函数的极限表达式,合并后可得到精确值公式:
精确值 = r/(1-x) + x/(1-x) = (r + x)/(1 - x)
精确计算代码
/** * 计算战斗剩余平均回合数(精确值) * @param r 至少一方命中时的剩余回合数 * @param x 双方同时未命中的概率,取值范围(0,1) */ function calculateExactRounds(r: number, x: number): number { return (r + x) / (1 - x); }
逻辑校验
- 当x趋近于0(几乎不会出现双miss),返回值趋近于r,符合无miss时的回合数预期
- 当x趋近于1(几乎必定双miss),返回值趋近于无穷大,符合战斗可能无限持续的逻辑
内容的提问来源于stack exchange,提问作者wvdz
相关产品推荐
相关产品推荐

