我的目标是从Lua的表中挑选一个随机项目.
这是我到目前为止所做的,但它目前不起作用:
local myTable = { 'a', 'b', 'c', 'd' }
print( myTable[ math.random( 0, #myTable - 1 ) ] )
Run Code Online (Sandbox Code Playgroud)
如何修复上述代码以使其按预期工作?(或者我可以使用哪种其他方法?)
Mic*_*man 62
Lua将表从1开始索引,不像C,Java等,它将数组从0开始索引.这意味着,在您的表中,有效索引是:1,2,3,4.您要查找的内容如下:
print( myTable[ math.random( #myTable ) ] )
Run Code Online (Sandbox Code Playgroud)
使用一个参数调用时,math.random(n)返回从1到n包含的随机整数.
ahm*_*adh 13
我认为这个问题还需要一个更一般的答案.使用从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)]]
Run Code Online (Sandbox Code Playgroud)
我还要补充说,Michal Kottman的原始解决方案可以完美地工作,如果你的所有键都是从1开始的数字序列.每当你创建一个表时,就会发生这种情况myTable = {'a','b','c'}.因此,对于以这种方式构建表的情况,从表中获取随机元素会更快.
测试:
t = {'a', 'b', 'c'}
print(t[0])
Run Code Online (Sandbox Code Playgroud)
给出nil. 事实上 0 超出范围(尝试t[20])...所以随机必须是从 1 到(含),因为如果你只写,表#myTable的第一个元素被标记(索引)为 1 ,请参阅表构造函数(“最后,字段exp 形式相当于 [i] = exp,其中 i 是从 1 开始的连续整数。 ")。exp
如果您仅向math.random传递一个参数n,您将获得一个从 1 到n1 之间的随机数。这修复了您的示例:
print(myTable[math.random(#myTable)])
Run Code Online (Sandbox Code Playgroud)