Random Lua-从一个范围(或表格)中选择一个随机值,不包括一个(或另一个)表格的值

Random Lua-从一个范围(或表格)中选择一个随机值,不包括一个(或另一个)表格的值,random,lua,choice,Random,Lua,Choice,一个范围,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中实现同样的功能?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中实现同样的功能?Lua有一个非常小的库,因此您必须编写自己的函数来完成许多其他语言自动提供的任务

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

-- 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
-- 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
要获得排除某些数字的序列,可以编写
seq_diff
函数;此版本使用
成员
功能:

-- 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
-- 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
样本交互:

>对于i=1,20 do
>>打印(来自不同范围(1,8,{1,4,3})的随机打印)
>>结束
8.
6.
8.
5.
5.
8.
6.
7.
8.
5.
2.
5.
5.
7.
2.
8.
7.
2.
6.
5.

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