如何解决Lua-从一个范围或表中选择一个随机值,但不包括一个或另一个表的值
一个范围1,2,3,4,5,6,7,8
(如果更容易,它可以填充Lua表)table = {1,3}
可能的随机选择应在2,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。