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

43

我的目标是从Lua表中随机选择一个项目。

这是我目前的代码,但它目前并不能工作:

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

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


1
我想补充一下。是的,lua数组默认的第一个索引是1。然而,你可以像这样从0开始:array = {[0] = 'a', 'b', 'c'} print(array[0]) >> a 'b'将跟随在索引1处,'c'将在索引2处... - eezing
6个回答

81

Lua的表是从1开始索引的,不同于C、Java等从0开始索引的数组。这意味着,在您的表中,有效的索引是:1、2、3、4。你需要找的是以下内容:

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

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


24

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

-- iterate over whole table to get all keys
local keyset = {}
for k in pairs(myTable) do
    table.insert(keyset, k)
end
-- now you can reliably return a random key
random_elem = myTable[keyset[math.random(#keyset)]]

我还要补充的是,如果你的所有键都是从1开始的数字序列,那么Michal Kottman的原始解决方案将完美地发挥作用。这种情况通常发生在您创建表格时使用myTable = {'a','b','c'}的方式。因此,在这种建立表格的情况下,按照他的方法获取表格中的随机元素会更快。


3

测试:

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

nil表示空值。实际上,0超出了范围(尝试使用t [20])......因此,随机数必须从1到#myTable(包括)之间选取,因为table的第一个元素被标记(索引)为1,如果只写exp,请参见Table constructor(“ 最后,形式为exp的字段等同于[i] = exp,其中i是从1开始的连续整数。”)。

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

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

1
function randomObjectFromTable(t)
   return t[math.random(1, #t)]
end

1
社区鼓励在代码旁边添加解释,而不是仅仅提供基于代码的答案(请参见此处)。 - costaparas

1
table = {'Apple', 'Banana', 'Orange', 'Watermelon' , 'lychee'} --my table have 5 item.

rand= math.random(1~5) --create a random number numbers 1 to 5 if more than 5 then the value is nil.

print(rand)
print(table[rand]) --unite the random number and item it will display 5 random items in the table.

0

我个人使用以下函数,受@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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接