2010-06-07 103 views
26

我的目標是從Lua中的表格中挑選一個隨機項目。從表中選擇一個隨機項目

這是我這麼遠,但它目前不工作:

local myTable = { 'a', 'b', 'c', 'd' } 
print(myTable[ math.random(0, #myTable - 1) ]) 

如何解決上面的代碼,以便它按預期工作? (或其他方法可以怎麼用?)

+1

想到我想補充一點。是的,默認情況下,lua數組中的第一個索引是1.但是,您可以從0開始,如下所示:array = {[0] ='a','b','c'} print(array [0 ])>> a'b'將在索引1處跟隨,並且在索引2處'c'... – user3113401 2013-12-18 01:20:46

回答

2

測試:

t = {'a', 'b', 'c'} 
print(t[0]) 

nil。也就是說,0是越界(嘗試t[20])...所以隨機必須從1到#myTable(含),所以你可以自己修復它。

55

Lua從1索引表,而不像C,Java等,它從0索引數組。這意味着,在你的表中,有效索引是:1,2,3,4。你要找的是以下:

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

當使用一個參數,math.random(n)返回從1到n包括隨機整數調用。

6

我認爲這個問題也需要更一般的答案。對於從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'}時,就會發生這種情況。因此,對於以這種方式構建表的情況,從表中獲取隨機元素會更快。

相關問題