我的目标是从Lua的表中挑选一个随机项目。
这是我到目前为止所做的,但它目前无效:
local myTable = { 'a', 'b', 'c', 'd' }
print( myTable[ math.random( 0, #myTable - 1 ) ] )
如何修复上述代码以使其按预期工作? (或者我可以使用哪种方法?)
答案 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