在JavaScript错误中实现二项分布?
我只是希望有人能仔细检查我的实现,以确保在数学和JS方面都是正确的。我想知道我的实现哪里出错了b/c公式计算的概率不一样,特别是概率三似乎有一个我找不到的计算错误 以下是JSFIDLE: 有3个功能我希望得到审查在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
请记住,所有
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)
}