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

时间:2010-06-07 09:15:34

标签: random lua

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

这是我到目前为止所做的,但它目前无效:

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

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

6 个答案:

答案 0 :(得分:61)

Lua对表中的表进行索引,不像C,Java等,它将数组从0开始索引。这意味着,在您的表中,有效索引是:1,2,3,4。您要查找的是以下内容:

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

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

答案 1 :(得分:11)

我认为这个问题还需要一个更一般的答案。使用从1开始的整数序列构建lua表没有限制。键可以是任何东西 - 它们甚至可以是其他lua表!在这种情况下,像#myTable这样的函数可能会给出你不期望的答案(当没有任何自定义的metatable功能时使用)。获取表中所有键的唯一可靠方法是迭代它:

-- 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)]]

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

答案 2 :(得分:1)

测试:

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的随机数。这修复了你的例子:

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

答案 3 :(得分:0)

我个人使用了@ahmadh启发的以下功能

function random_elem(tb)
    local keys = {}
    for k in pairs(tb) do table.insert(tb, k) end
    return tb[keys[math.random(#keys)]]
end

答案 4 :(得分:0)

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.

答案 5 :(得分:0)

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