Lua - 从一个范围(或 table)中选择一个随机值,不包括一个(或另一个)table 的值
Lua - Choose a random value from a range (or table) excluding the values of a (or another) table
一个范围,1, 2, 3, 4, 5, 6, 7, 8
(它可以填充一个 Lua table 如果它更容易的话)
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 有一个非常小的库,因此您必须编写自己的函数来完成许多其他语言自动提供的一些任务。
解决此问题的一个好方法是编写可解决部分问题的小函数,并将它们合并到最终解决方案中。在这里最好有一个数字范围,其中某些数字被排除在外,从中随机抽取一个数字。可以使用 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
一个范围,1, 2, 3, 4, 5, 6, 7, 8
(它可以填充一个 Lua table 如果它更容易的话)
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 有一个非常小的库,因此您必须编写自己的函数来完成许多其他语言自动提供的一些任务。
解决此问题的一个好方法是编写可解决部分问题的小函数,并将它们合并到最终解决方案中。在这里最好有一个数字范围,其中某些数字被排除在外,从中随机抽取一个数字。可以使用 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