我的目標是從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