将n除以x个随机部分

时间:2014-10-13 00:47:21

标签: random lua numbers dice divide

我需要实现的基本上是x骰子掷骰= n总和但是向后。

所以让我们创建一个例子:

骰子必须滚动5次(最小总和5,最大总和30),这意味着:

x = 5

让我们说在这种情况下,滚动的总和是23,这意味着:

n = 23

所以我需要的是获得任何可能的单个掷骰子组合(例如6,4,5,3,5)

到目前为止,我能想到的是:

  1. 创建5个随机数。
  2. 将它们加起来得到总和。
  3. 现在将每个随机数除以总和并乘以所需数字​​23。
  4. 结果是5个等于所需数字23的随机数。
  5. 问题是这个根据随机数返回随机值(小数,值低于1和高于6)。我找不到一种方法来编辑公式只返回整数> = 1或< = 6。

3 个答案:

答案 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,该列表包含具有该总和的所有组合,现在只需随机选择其中一个。任何其他号码都相同。