2010-06-07 68 views
26

我的目标是从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处跟随,并且在索引2处'c'... – user3113401 2013-12-18 01:20:46

回答

2

测试:

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

nil。也就是说,0是越界(尝试t[20])...所以随机必须从1到#myTable(含),所以你可以自己修复它。

55

Lua从1索引表,而不像C,Java等,它从0索引数组。这意味着,在你的表中,有效索引是:1,2,3,4。你要找的是以下:

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

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

6

我认为这个问题也需要更一般的答案。对于从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'}时,就会发生这种情况。因此,对于以这种方式构建表的情况,从表中获取随机元素会更快。

相关问题