Lua - 从范围(或表)中选择一个排除另一个表中的值的随机值

一个范围,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中实现相同的功能吗?

点赞
用户6879826
用户6879826

Lua 的库非常精简,因此您将需要编写自己的函数来执行许多其他语言中自动提供的某些任务。

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

-- 返回包含范围[a,b]的序列。
function range (a, b)
  local r = {}
  for i = a, b do
    r[#r + 1] = i
  end
  return r
end

要获取一些数字被排除的序列,可以编写一个seq_diff函数;此版本利用了一个member函数:

-- 如果x是表t中的值,则返回true。
function member (x, t)
  for k, v in pairs(t) do
    if v == x then
      return true
    end
  end
  return false
end

-- 返回序列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

最后,可以将这些较小的函数组合成解决方案:

-- 从范围中(包括)[a,b]返回随机数字,
-- 排除序列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
2020-11-03 21:36:21