Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 从表中随机选择一项_Random_Lua - Fatal编程技术网

Random 从表中随机选择一项

Random 从表中随机选择一项,random,lua,Random,Lua,我的目标是从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])。。。所以random必须是从1到#myTabl

我的目标是从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]
)。。。所以random必须是从1到
#myTable
(包括在内),因为如果只写
exp
,则a的第一个元素被标记(索引)为1,请参见(“最后,exp形式的字段相当于[i]=exp,其中i是从1开始的连续整数。”)

如果只传递一个参数
n
,则获得一个从1到
n
的随机数。这修复了您的示例:

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

Lua从1索引表,不像C、Java等从0索引数组。这意味着,在您的表中,有效索引是:1、2、3、4。您需要的是以下内容:

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

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

我认为这个问题还需要一个更一般的答案。使用从1开始的整数序列构建lua表没有限制。钥匙可以是任何东西——它们甚至可以是其他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开始的数字序列,那么原始的解决方案将非常有效。每当您将表创建为
myTable={'a'、'b'、'c'}
时,就会发生这种情况。因此,在以这种方式构建表的情况下,从表中获取随机元素的速度会更快。

我个人使用了以下受@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

我想我会加上这个。是,默认情况下,lua数组中的第一个索引为1。但是,您可以让它从0开始,如下所示:array={[0]='a','b','c'}print(array[0])>>a'b'将在索引1和'c'在索引2处跟进……社区鼓励在代码中添加解释,而不是纯粹基于代码的答案(请参阅)。
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.
function randomObjectFromTable(t)
   return t[math.random(1, #t)]
end