const probabilities = [newArray(gMaxValue * number + 1), newArray(gMaxValue * number + 1)] let flag = 0
// 初始化 for (let i = 0; i < gMaxValue * number + 1; ++i) { probabilities[0][i] = probabilities[1][i] = 0 }
// 第一次掷骰子,出现的和只有有 gMaxValue 种情况,每种和的次数为 1 for (let i = 1; i <= gMaxValue; ++i) { probabilities[flag][i] = 1 }
// 之后是从第 2 ~ number 次掷骰子 // for (let k = 2; k <= number; ++k) { // 第k次掷骰子,那么最小值就是k // 不可能出现比k小的情况 for (let i = 0; i < k; ++i) { probabilities[1 - flag][i] = 0 }
// 可能出现的和的范围就是 [k, gMaxValue * k + 1) // 此时和为i的出现次数,就是上次循环中骰子点数和为 // i - 1, i - 2, ..., i - 6 的次数总和 for (let i = k; i < gMaxValue * k + 1; ++i) { probabilities[1 - flag][i] = 0 // 这里的j是指:本骰子掷出的结果 for (let j = 1; j < i && j <= gMaxValue; ++j) { probabilities[1 - flag][i] += probabilities[flag][i - j] } }
flag = 1 - flag }
// 全部情况的总数 const total = Math.pow(gMaxValue, number) for (let i = number; i < gMaxValue * number + 1; ++i) { console.log(`sum is ${i}, ratio is ${probabilities[flag][i] / total}`) } }