【问题标题】:Lua - Choose a random value from a range (or table) excluding the values of a (or another) tableLua - 从范围(或表)中选择一个随机值,不包括(或另一个)表的值
【发布时间】:2020-11-03 20:20:08
【问题描述】:

一个范围,1, 2, 3, 4, 5, 6, 7, 8(如果它更容易,它可以填充 Lua 表)
table = {1, 4, 3}

可能的随机选择应该在2, 5, 6, 7, 8之间。

在 Python 中,我使用它来获取它:

possibleChoices = random.choice([i for i in range(9) if i not in table])

任何想法如何在 Lua 中实现相同的目标?

【问题讨论】:

  • 对否决票的解释是合适的。

标签: random lua choice


【解决方案1】:

Lua 有一个非常小的库,因此您必须编写自己的函数来执行许多其他语言自动提供的一些任务。

解决这个问题的一个好方法是编写小函数来解决部分问题,并将它们合并到最终解决方案中。在这里,最好有一个数字范围,其中某些数字被排除在外,从中随机抽取一个数字。使用range函数可以获得范围:

-- Returns a sequence containing the range [a, b].
function range (a, b)
  local r = {}
  for i = a, b do
    r[#r + 1] = i
  end
  return r
end

要获得排除了某些数字的序列,可以编写seq_diff 函数;这个版本使用了member 函数:

-- Returns true if x is a value in the table t.
function member (x, t)
  for k, v in pairs(t) do
    if v == x then
      return true
    end
  end
  return false
end

-- Returns the sequence u - v.
function seq_diff (u, v)
  local result = {}
  for _, x in ipairs(u) do
    if not member(x, v) then
      result[#result + 1] = x
    end
  end
  return result
end

最后这些较小的功能可以组合成一个解决方案:

-- Returns a random number from the range [a, b],
-- excluding numbers in the sequence seq.
function random_from_diff_range (a, b, seq)
  local selections = seq_diff(range(a, b), seq)
  return selections[math.random(#selections)]
end

示例交互:

> for i = 1, 20 do
>> print(random_from_diff_range(1, 8, {1, 4, 3}))
>> end
8
6
8
5
5
8
6
7
8
5
2
5
5
7
2
8
7
2
6
5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2012-03-04
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多