我需要实现的基本上是x骰子掷骰= n总和但是向后。
所以让我们创建一个例子:
骰子必须滚动5次(最小总和5,最大总和30),这意味着:
x = 5
让我们说在这种情况下,滚动的总和是23,这意味着:
n = 23
所以我需要的是获得任何可能的单个掷骰子组合(例如6,4,5,3,5)
到目前为止,我能想到的是:
问题是这个根据随机数返回随机值(小数,值低于1和高于6)。我找不到一种方法来编辑公式只返回整数> = 1或< = 6。
答案 0 :(得分:1)
如果您不需要将其扩展到最远,最简单的方法是重新随机化,直到您得到正确的金额。任何现代cpu都需要几毫秒。不太好。
#!/usr/local/bin/lua
math.randomseed(os.time())
function divs(n,x)
local a = {}
repeat
local s = 0
for i=1,x do
a[i] = math.random(6)
s = s + a[i]
end
until s==n
return a
end
a = divs(23,5)
for k,v in pairs(a) do print(k,v) end
答案 1 :(得分:1)
这是一个有趣的问题。这是我的看法:
编辑:我错过了你需要他们做骰子的事实。这是一个新的尝试。作为奖励,您可以在可选参数中指定骰子的边数。local function getDiceRolls(n, num_rolls, num_sides)
num_sides = num_sides or 6
assert(n >= num_rolls, "n must be greater than num_rolls")
assert(n <= num_rolls * num_sides, "n is too big for the number of dices and sides")
local rolls = {}
for i=1, num_rolls do rolls[i] = 1 end
for i=num_rolls+1, n do
local index = math.random(1,num_rolls)
while rolls[index] == num_sides do
index = (index % num_rolls) + 1
end
rolls[index] = rolls[index] + 1
end
return rolls
end
-- tests:
print(unpack(getDiceRolls(21, 4))) -- 6 4 6 5
print(unpack(getDiceRolls(21, 4))) -- 5 5 6 5
print(unpack(getDiceRolls(13, 3))) -- 4 3 6
print(unpack(getDiceRolls(13, 3))) -- 5 5 3
print(unpack(getDiceRolls(30, 3, 20))) -- 9 10 11
print(unpack(getDiceRolls(7, 7))) -- 1 1 1 1 1 1 1
print(unpack(getDiceRolls(7, 8))) -- error
print(unpack(getDiceRolls(13, 2))) -- error
答案 2 :(得分:0)
如果卷的数量没有大幅变化,但总和没有变化,则值得为给定总和的组合创建查找表。您将生成每个组合,并为每个组合计算总和,然后将组合添加到与该总和关联的列表中。查找表如下所示:
T = {12 = {{1,2,3,4,2},{2,5,3,1,1},{2,2,2,3,3}, ...}, 13=....}
然后,当您想要随机选择n = 23的组合时,在表格中查找键23,该列表包含具有该总和的所有组合,现在只需随机选择其中一个。任何其他号码都相同。