在JavaScript错误中实现二项分布?

在JavaScript错误中实现二项分布?,javascript,probability,Javascript,Probability,我只是希望有人能仔细检查我的实现,以确保在数学和JS方面都是正确的。我想知道我的实现哪里出错了b/c公式计算的概率不一样,特别是概率三似乎有一个我找不到的计算错误 以下是JSFIDLE: 有3个功能我希望得到审查 概率1 概率二 概率三 公式如下 P(d,n)=1-(d-1/d)^n P(d,n,o)=1-(d-(d-o+1)/d)^n P(d,n,o,k)=nCk*(P*k)*q^(n)−(k) 对于nCk,我实现了 如果您需要更多信息,请随时询问。我会尽力提供的 例如: 这里的结果是9.75

我只是希望有人能仔细检查我的实现,以确保在数学和JS方面都是正确的。我想知道我的实现哪里出错了b/c公式计算的概率不一样,特别是概率三似乎有一个我找不到的计算错误

以下是JSFIDLE:

有3个功能我希望得到审查

  • 概率1
  • 概率二
  • 概率三
  • 公式如下

  • P(d,n)=1-(d-1/d)^n
  • P(d,n,o)=1-(d-(d-o+1)/d)^n
  • P(d,n,o,k)=nCk*(P*k)*q^(n)−(k)
  • 对于nCk,我实现了

    如果您需要更多信息,请随时询问。我会尽力提供的

    例如:

    这里的结果是9.75%

    函数概率{ //获得骰子数 var n=document.getElementById(“n1”).value //每个模具上都有侧面 var d=document.getElementById(“d1”).value //算计 变量概率=1-((d-1)/d)**n prob=parseFloat(prob*100).toFixed(2)+“%” prob=`${prob}` //打印概率 var p=document.createElement('p') p、 innerHTML=prob document.getElementById(“output1”).appendChild(p) } 这里的结果是9.75%

    函数概率{ //获得骰子数 var n=document.getElementById(“n2”).value //每个模具上都有侧面 var d=document.getElementById(“d2”).value //得到具体的结果 var o=document.getElementById(“o2”).value //算计 var prob=1-((d-(d-o+1))/d)**n prob=parseFloat(prob*100).toFixed(2)+“%” prob=`${prob}` //打印概率 var p=document.createElement('p') p、 innerHTML=prob document.getElementById(“output2”).appendChild(p) } 这里的结果是18.00%,而不是9.75%

    函数概率{ //用户输入 //获得骰子数 var n=document.getElementById(“n3”).value //每个模具上都有侧面 var d=document.getElementById(“d3”).value //获取定义成功的值 var o=document.getElementById(“o3”).value //获得所需的成功次数 var k=document.getElementById(“k3”).value //计算 //p var p=((d-o)+1)/10 log(`p:${p}`) //q var q=(1-p) log(`q:${q}`) //nCr var vnCr=nCr(n,k) log(`nCr:${vnCr}`) //p**k var pk=p**k log(`p**k:${pk}`) //q**n-k 变量pnk=q**(n-k) log(`q**n-k:${pnk}`) //概率 变量概率=(vnCr*pk*pnk)/(p+q)**n log(`Prob:${Prob}`) prob=parseFloat(prob*100).toFixed(2)+“%” prob=`${prob}` //打印概率 var p=document.createElement('p') p、 innerHTML=prob document.getElementById(“output3”).appendChild(p) }
    请记住,所有
    document.getElementById(…).value
    都是字符串,请确保在计算公式之前将它们转换为数字。我的第一个猜测是,您的组合函数变得混乱,因为阶乘太大,无法放入浮点。对于小数字,该函数是否正常工作?也许可以尝试对小数字进行精确计算,然后使用斯特林公式(对于阶乘)或其他更大数字的近似值。@RobertDodier,是的,它是有效的,但当将其与
    概率\u two()的结果进行比较时,问题就出现了。只有当n=1时,它们才是一致的。我想知道
    probability\u two()
    是否存在舍入问题……我没有看到任何明显的问题;似乎一般的方法应该适用于少数人。在这一点上,我的建议是将每个问题分解成几个部分,并验证每个部分。例如,组合的计算很重要。尝试验证组合功能是否正常工作。这可能意味着首先要验证你的阶乘。试着分别处理每个部分(我指的是第一部分、第二部分和第三部分)。
    function factorialize(num) {
    // Step 1. Create a variable result to store num
    var result = num;
     
    // If num = 0 OR num = 1, the factorial will return 1
    if (num === 0 || num === 1) 
        return 1; 
    
    // Instatiate the while loop
    while (num > 1) {
        // Decrement by 1 
        num--
        // Update the result
        result *= num
    }
    // Return
    return result;
    }
    
    function nCr(n, r){
    // Compute n factorial
    var nFact = factorialize(n)
    // Compute r factorial
    var rFact = factorialize(r)
    // Compute n - r factorial
    var nrFact = factorialize(n - r)
    // Compute nCr
    var result = (nFact / (rFact * nrFact))
    // Return
    return result
    }
    
    function probability_one() {
    // Get number of dice
    var n = document.getElementById("n1").value
    // Get sides on each die
    var d = document.getElementById("d1").value
    // Calculate
    var prob = 1 - ((d - 1) / d)**n
    prob = parseFloat(prob*100).toFixed(2)+"%"
    prob = `<B>${prob}</B>`
    // Print the probability
    var p = document.createElement('p')
    p.innerHTML = prob
    document.getElementById("output1").appendChild(p)
    }
    
    function probability_two() {
    // Get number of dice
    var n = document.getElementById("n2").value
    // Get sides on each die
    var d = document.getElementById("d2").value
    // Get the specific outcome
    var o = document.getElementById("o2").value
    // Calculate
    var prob = 1 - ((d - (d - o + 1)) / d)**n
    prob = parseFloat(prob*100).toFixed(2)+"%"
    prob = `<B>${prob}</B>`
    // Print the probability
    var p = document.createElement('p')
    p.innerHTML = prob
    document.getElementById("output2").appendChild(p)
    }
    
    function probability_three(){
    // USER INPUTS
        // Get number of dice
        var n = document.getElementById("n3").value
        // Get sides on each die
        var d = document.getElementById("d3").value
        // Get the value that defines a success
        var o = document.getElementById("o3").value
        // Get the number of success needed
        var k = document.getElementById("k3").value
    // CALCULATIONS
        // p
        var p = ((d - o) + 1)/10
        console.log(`p: ${p}`)
        // q
        var q = (1 - p)
        console.log(`q: ${q}`)
        // nCr
        var vnCr = nCr(n, k)
        console.log(`nCr: ${vnCr}`)
        // p**k
        var pk = p**k
        console.log(`p**k: ${pk}`)
        // q**n-k
        var pnk = q**(n-k)
        console.log(`q**n-k: ${pnk}`)
        // Probability
        var prob = (vnCr * pk * pnk) / (p + q)**n
        console.log(`Prob.: ${prob}`)
        prob = parseFloat(prob*100).toFixed(2)+"%"
        prob = `<B>${prob}</B>`
    // Print the probability
    var p = document.createElement('p')
    p.innerHTML = prob
    document.getElementById("output3").appendChild(p)
    }