我的目标是从Lua中的表格中挑选一个随机项目。从表中选择一个随机项目
这是我这么远,但它目前不工作:
local myTable = { 'a', 'b', 'c', 'd' }
print(myTable[ math.random(0, #myTable - 1) ])
如何解决上面的代码,以便它按预期工作? (或其他方法可以怎么用?)
我的目标是从Lua中的表格中挑选一个随机项目。从表中选择一个随机项目
这是我这么远,但它目前不工作:
local myTable = { 'a', 'b', 'c', 'd' }
print(myTable[ math.random(0, #myTable - 1) ])
如何解决上面的代码,以便它按预期工作? (或其他方法可以怎么用?)
测试:
t = {'a', 'b', 'c'}
print(t[0])
给nil
。也就是说,0是越界(尝试t[20]
)...所以随机必须从1到#myTable
(含),所以你可以自己修复它。
Lua从1索引表,而不像C,Java等,它从0索引数组。这意味着,在你的表中,有效索引是:1,2,3,4。你要找的是以下:
print(myTable[ math.random(#myTable) ])
当使用一个参数,math.random(n)
返回从1到n
包括随机整数调用。
我认为这个问题也需要更一般的答案。对于从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'}
时,就会发生这种情况。因此,对于以这种方式构建表的情况,从表中获取随机元素会更快。
想到我想补充一点。是的,默认情况下,lua数组中的第一个索引是1.但是,您可以从0开始,如下所示:array = {[0] ='a','b','c'} print(array [0 ])>> a'b'将在索引1处跟随,并且在索引2处'c'... – user3113401 2013-12-18 01:20:46