【问题标题】:Translate mathematic formula to Javascript将数学公式翻译成 Javascript
【发布时间】:2014-11-25 09:15:11
【问题描述】:

我有这个公式:

f(x)=(x^0+x^0+x^1+x^101+x^2+x^202)^n

这基本上是滚动 n 面显示值的骰子时的概率:

{0,0,1,101,2,202}

如何将其转换为 JavaScript?

我知道我可以使用递归函数来获取每一个结果并将它们添加到结果数组中,但是任何超过 9 个骰子的东西都会变得很长。

编辑:请注意 x 不是变量。这是一些花哨的数学符号,代表我忘记了概率。

【问题讨论】:

  • Math.pow(base, exponent)(尝试一下然后回复我们)
  • 你能详细说明一下你的公式吗?有固定数量的骰子吗?骰子的面数总是相同吗?什么决定了 n 的值?您可能可以传入一组骰子值,迭代和求和,然后将总数提高到 n 次方,但我不清楚这是否是竞争图。
  • n 是一个参数。你可以随心所欲地选择它。
  • 这个问题是有道理的,虽然措辞不好。它询问如何将 formal 多项式(或生成函数)提高到给定的幂。鉴于缺乏上下文,Renan 的回答虽然合理,但在这里并不正确。

标签: javascript math probability dice


【解决方案1】:

您问题中的 x 是一个形式变量,并且您要求一个程序来计算该变量中形式多项式的幂。这是一个快速实现。警告:我还没有执行它,无论如何它都缺乏修饰。但我希望你能明白。

function polynomial_unit() {
  return [1]; // Represents 1 = 1x^0
}

function polynomial_mult(x, y) {
  var z = Array.apply(null, new Array((x.length + y.length - 1))).map(Number.prototype.valueOf,0);
  for(var i = 0; i < x.length; i++) {
    for(var j = 0; j < y.length; j++) {
      z[i+j] += x[i]*y[j];
    }
  }
  return z;
}

function generic_exp(base, exponent, mult, unit) {
  var t = unit;
  while (exponent > 1) {
    if (exponent%2 == 1) t = mult(t, base);
    base = mult(base, base);
    exponent = Math.floor(exponent/2);
  }
  return mult(t, base);
}

function Wildhorn(n) {
  var f = Array.apply(null, new Array(203)).map(Number.prototype.valueOf,0);
  f[0] = 2; f[1] = 1; f[2] = 1; f[101] = 1; f[202] = 1;
  return generic_exp(f, n, polynomial_mult, polynomial_unit());
}

【讨论】:

  • 哇,看起来就像我今天下午和一位统计学教授最终想出的一样(但比我的更美观)。
  • 您刚刚在第二个 for 循环中犯了 1 个错误。你用 i 而不是 j。
  • @Wildhorn:很高兴听到这个消息。你可能喜欢使用像 PARI/GP 这样的系统,它内置了这种操作——你只需输入,例如,(2+x+x^101+x^202)^7。 (您也可以考虑通过单击左侧的复选标记来接受我的回答。)
  • 我发现数组需要在创建时用 0 填充才能正常工作,否则它会在添加数字之前在某个位置填充 NaN,然后​​它会阻止添加更多数字。
【解决方案2】:

Javascript 中有一个名为 Math 的全局对象,它具有数学函数。其中之一是求幂:Math.pow

你可以这样使用它:

Math.pow(base, exponent);

示例用法:

Math.pow(2, 4); // result == 16.

因此,您的函数可以编码为:

function WildhornDice (n) {
    var x = someFancyMathematiqueSymbolThatRepresentIForgotWhat;

    var result = Math.pow(x, 0) + // this should always be 1, right 
                 Math.pow(x, 0) + // again, but only because I saw it in the question
                 Math.pow(x, 1) + // which equals x as far as I know
                 Math.pow(x, 101) +
                 Math.pow(x, 2) +
                 Math.pow(x, 202);

    result = Math.pow(result, n);

    return result;
}

【讨论】:

  • 我编辑了原始帖子:注意 x 不是变量。这是一些花哨的数学符号,代表我忘记了概率。
  • 所以 x^202 表示得到结果 202 的概率。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多