2010-06-07 6 views
26

Il mio obiettivo è scegliere un oggetto a caso da un tavolo di Lua.Scegli un oggetto a caso da un tavolo

Questo è quello che ho finora, ma attualmente non funziona:

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

Come posso risolvere il codice di cui sopra in modo che funzioni come previsto? (O che altro metodo posso usare?)

+1

Pensavo di aggiungere a questo. Sì, per impostazione predefinita il primo indice in un array lua è 1. Tuttavia, potresti farlo partire da 0 in questo modo: array = {[0] = 'a', 'b', 'c'} print (array [0 ]) >> a 'b' seguirà l'esempio all'indice 1 e 'c' all'indice 2 ... – user3113401

risposta

2

prova:

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

nil. Ovvero, 0 è fuori limite (prova t[20]) ... in modo casuale deve essere compreso tra 1 e #myTable (incluso), quindi puoi aggiustarlo da solo.

55

Lua indicizza tabelle da 1, a differenza di C, Java ecc. Che indicizza matrici da 0. Ciò significa che nella tabella gli indici validi sono: 1, 2, 3, 4. Quello che stai cercando è seguente:

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

Quando chiamata con un argomento, math.random(n) restituisce un numero reale casuale da 1 a n compreso.

6

Penso che la domanda abbia anche bisogno di una risposta più generale. Non c'è limite alle tabelle lua da costruire con una sequenza di numeri interi a partire da 1. Le chiavi possono essere davvero qualsiasi cosa - potrebbero anche essere altri tavoli lua! In tali casi, funzioni come #myTable potrebbero fornire una risposta che non ti aspetti (se utilizzata senza alcuna funzionalità di metatable personalizzata). L'unico modo affidabile per ottenere tutte le chiavi in ​​una tabella è quello di scorrere su di esso:

-- 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)]] 

Vorrei anche aggiungere che la soluzione originale di Michal Kottman funzionerebbe perfettamente se tutte le chiavi sono una sequenza di numeri a partire dal 1. Ciò accade ogni volta che crei una tabella come myTable = {'a','b','c'}. Quindi, per le situazioni in cui le tabelle sono costruite in questo modo, ottenere elementi casuali dal tavolo sarebbe più veloce a suo modo.