我的目标是从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 ) ] )
如何修复上面的代码,使其按预期工作?(或者我可以使用哪种其他方法?)
Lua的表是从1开始索引的,不同于C、Java等从0开始索引的数组。这意味着,在您的表中,有效的索引是:1、2、3、4。你需要找的是以下内容:
print( myTable[ math.random( #myTable ) ] )
当使用一个参数调用math.random(n)
时,返回的是从1到n
之间(包括1和n
)的随机整数。
我认为这个问题还需要一个更加通用的答案。Lua表不仅限于由从1开始的整数序列构建。键可以是任何内容,甚至可以是其他的Lua表!在这种情况下,像#myTable这样的函数可能会给出你意想不到的答案(当没有使用任何自定义元表功能时)。获取表中所有键的唯一可靠方法是迭代它:
-- 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)]]
我还要补充的是,如果你的所有键都是从1开始的数字序列,那么Michal Kottman的原始解决方案将完美地发挥作用。这种情况通常发生在您创建表格时使用myTable = {'a','b','c'}
的方式。因此,在这种建立表格的情况下,按照他的方法获取表格中的随机元素会更快。
测试:
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
的随机数(包括n)。这修复了您的示例:
print(myTable[math.random(#myTable)])
function randomObjectFromTable(t)
return t[math.random(1, #t)]
end
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.
我个人使用以下函数,受@ahmadh启发
function random_elem(tb)
local keys = {}
for k in pairs(tb) do table.insert(keys, k) end
return tb[keys[math.random(#keys)]]
end