微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。