【发布时间】:2019-05-05 17:05:23
【问题描述】:
我正在尝试提出一个解决方案,我需要掷一些骰子(所有骰子大小相同)并达到指定的数字。如果我已经进行了所有验证以确保数字有效并且理论上可以达到预期的结果,那么有没有人有一个很好的算法来解决这个问题?请注意,它应该是随机的,而不仅仅是一个直线。
一些例子
掷出 3 d6 得到 14 -> 所以它可以输出 5,3,6 或 6,6,2
掷 4 d20 得到 66 -> 所以它可以输出 16,14,19,17
我需要一个通用函数,它可以接受任意大小的骰子、任意掷骰数和期望的结果。
我最初的尝试如下,虽然这不会产生所需的输出(你现在可以忽略mod,这也是为了允许修饰符)。此示例还缺少对可实现所需输出的验证,但这不是问题的一部分。
let desired = 19
let mod = 0
let dm = desired - mod
let n = 5;// number of dice
let d = 6 // dice sides
let nums = []
for(i =0; i< n; i++) {
nums.push(Math.round(Math.random() * Math.round(d)) + 1)
}
let sum = nums.reduce((acc,val) => acc + val)
nums = nums.map(a => Math.round((a/sum) * dm))
let diff = dm - (nums.reduce((acc,val) => acc + val))
function recursive(diff) {
let ran = nums[Math.random() * Math.round(nums.length -1)]
if(nums[ran] + diff > d || nums[ran] + diff < 1) {
recursive(diff)
} else {
nums[ran] += diff
}
}
while(diff != 0) {
recursive(diff)
diff += diff < 0 ? 1 : -1;
}
alert(nums)
【问题讨论】:
-
每个目标只需要一组有效的掷骰子?
-
是的,我想函数签名将类似于:
function generateRolls(desiredResult, numberOfDiceToRoll, numberOfDiceSides)我希望它们看起来是随机的,所以不仅仅是将结果除以 numberOfDice 的情况跨度> -
好的,所以你从要求你在最后一卷有足够的射程到零的要求向后工作,从目标开始倒计时。例如,当您有 D6 时,这是为了避免需要 8 个。
-
你能再扩展一下吗?或许可以回答一下?
-
你真的只需要一个“随机”的分区,还是会用相同的参数重复调用函数?如果可以进行一些预计算,您可以获得均匀分布的解决方案,但对于单个解决方案而言,这需要大量工作。
标签: javascript algorithm dice