从表格中随机选择一个项目。

我的目标是从 Lua 表中随机取出一个项目。

目前我已经做到了这一点,但它目前不起作用:

local myTable = { 'a', 'b', 'c', 'd' }
print( myTable[ math.random( 0, #myTable - 1 ) ] )

我该如何修复以上代码,使其按预期工作?(或者我可以使用哪种方法?)

原文链接 https://stackoverflow.com/questions/2988246

点赞
stackoverflow用户354803
stackoverflow用户354803

测试:

t = {'a', 'b', 'c'}
print(t[0])

输出nil。实际上,0 越界了(尝试一下t[20])......因此随机数必须从1到 #myTable (包括)之间选择,因为在只写 exp 的情况下,table 的第一个元素被标记(索引)为1,请参见 Table constructor(" finally,形式为exp的字段等效于[i] = exp,其中i是从1开始的连续整数。 ").

如果您向 math.random 传递一个参数 n,则您将获得从1到 n(包括)之间的随机数。这修复了您的示例:

print(myTable[math.random(#myTable)])
2010-06-07 09:24:47
stackoverflow用户221509
stackoverflow用户221509

Lua索引表格从1开始,而不是C、Java等把数组索引从0开始的语言。这意味着,在您的表格中,有效的索引为:1、2、3、4。您所需要的是以下代码:

print( myTable[ math.random( #myTable ) ] )

当使用一个参数调用math.random(n)时,它将返回1到n之间的一个随机整数,包括1和n

2010-06-07 09:56:23
stackoverflow用户1159685
stackoverflow用户1159685

我认为这个问题还需要一个更加普遍的回答。 Lua 表建立不必从 1 开始的整数序列。键可以是任何东西——甚至可以是其他的 Lua 表!这种情况下,像 #myTable 这样的函数可能会给出你意想不到的答案(当没有使用自定义元表功能时)。获取表中所有键的唯一可靠方法是迭代它:

-- 遍历整个表以获取所有键
local keyset = {}
for k in pairs(myTable) do
    table.insert(keyset, k)
end
-- 现在你可以可靠地返回一个随机键
random_elem = myTable[keyset[math.random(#keyset)]]

我还要补充一点,Michal Kottman 的原始解决方案在所有键都是从 1 开始的数字序列时可以完美地工作。这种情况发生在你创建一个表时,如 myTable = {'a','b','c'}。对于这种方式建立表的情况,按他的方式从表中获取随机元素会更快。

2016-05-26 18:41:32
stackoverflow用户5831419
stackoverflow用户5831419

我个人使用以下函数,灵感来自 @ahmadh:

function random_elem(tb)
    local keys = {}
    for k in pairs(tb) do table.insert(keys, k) end
    return tb[keys[math.random(#keys)]]
end
2018-10-29 21:23:06
stackoverflow用户14142059
stackoverflow用户14142059
table = {'Apple', 'Banana', 'Orange', 'Watermelon' , 'lychee'} --我的表格有5个项目。

rand= math.random(1~5) --创建一个随机数,范围为1到5,如果大于5,则值为nil。

print(rand)
print(table[rand]) --将随机数和项目合并,它将显示表格中的5个随机项目。
2020-09-01 11:31:24
stackoverflow用户14957504
stackoverflow用户14957504
## 从表中随机获取对象

```lua
function randomObjectFromTable(t)
   return t[math.random(1, #t)]
end
2021-01-24 06:12:30