对于棋盘游戏的赔率计算器,我需要计算一场战斗平均会持续多少回合.由于战斗双方都有可能失利,因此理论上一场战斗可以永远持续下go .因此,我无法遍历所有分支,但需要计算数学极限.通过使用模拟器进行验证,我发现以下函数正确地近似于剩余的平均轮数:

// LIMIT could be any number, the larger it is, the more accurate the result.
const LIMIT = 100;
// r is the number of rounds left if at least 1 of the sides hit
// x is the chance that both sides miss and the round count gets increased,
// but the battle state stays the same.
function approximateLimitForNumberOfRounds(r: number, x: number) {
  let approx = r / (1 - x);
  // n -> infinity
  for (let n = 1; n < LIMIT; n++) {
    approx += x ** n;
  }
  return approx;
}

如何修改此函数以准确计算剩余的轮数,而不是近似计算?(注意,由于x是一个机会,它包含在(0, 1)0 < x < 1中).

推荐答案

我们可以注意到,approx具有以下值:

r / (1 - x) # I refer to this as 'a' below
a + x
a + x + x^2
a + x + x^2 + x^3
a + x + x^2 + ... + x^n

因此,我们可以将数学表达式简化为:

a + (the sum of x^k from k = 1 to k = n)

接下来,我们必须注意,序列x + x^2 + x^3 ...形成了具有第一项x和公共比率x的几何序列.由于x0 < x < 1为界,这将有一个限制和,即:

x + x^2 + x^3 + ... x^inf = x/(1-x)

(当取x = 1时,以及在取r / (1 - x)的原始函数中,这显然是失败的,但在这种情况下,你只需将和设为无穷大,如果不是undefinedapprox将转义为无穷大;因此我假设在以下计算中x != 1x = 1可以/已经分别处理)

现在,因为我们有一个x + x^2 + ...到无穷大的表达式,还有一个approx包含x + x^2 + ...的表达式,所以我们可以使用这两个事实来写approx:

approx = r / (1 - x) + x / (1 - x)
approx = (r + x) / (1 - x)

你来了!这是你在问题中概述的逻辑的数学类似功能,压缩为一个语句(我认为这是正确的:).

Javascript相关问答推荐

如何指定1条记录1个表?

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

如何修复内容安全策略指令脚本-SRC自身错误?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

窗口.getComputedStyle()在MutationObserver中不起作用

if/else JavaScript中的条件行为

Cookie中未保存会话数据

WebRTC关闭navigator. getUserMedia正确

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

如何禁用附加图标点击的v—自动完成事件

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何从网站www.example.com获取表与Cheerio谷歌应用程序脚本

优化Google Sheet脚本以将下拉菜单和公式添加到多行

如何从HTML对话框中检索单选项组的值?

Next.js服务器端组件请求,如何发送我的cookie token?

如何使用JavaScript拆分带空格的单词

JavaScript不重定向配置的PATH

在GraphQL解析器中修改上下文值

ReferenceError:无法在初始化之前访问setData

设置复选框根据选中状态输入选中值