2010-06-07 3 views
26

Mein Ziel ist es, einen zufälligen Artikel aus einer Tabelle in Lua auszuwählen.Wählen Sie einen zufälligen Artikel aus einer Tabelle

Das ist, was ich so weit gekommen, aber es funktioniert noch nicht:

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

Wie kann ich den obigen Code zu beheben, so dass es wie vorgesehen funktioniert? (Oder die andere Methode könnte ich verwenden?)

+1

Ich dachte, ich würde hinzufügen. Ja, standardmäßig ist der erste Index in einem lua-Array 1. Sie könnten ihn jedoch bei 0 wie folgt starten lassen: array = {[0] = 'a', 'b', 'c'} print (Array [0 ]) >> a 'b' wird bei Index 1 und 'c' bei Index 2 folgen ... – user3113401

Antwort

2

Test:

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

gibt nil. Das heißt, 0 ist außerhalb der Grenzen (versuchen t[20]) ... so zufällig muss von 1 bis #myTable (inklusive) sein, so dass Sie es selbst beheben können.

55

Lua Indizes Tabellen von 1, im Gegensatz zu C, Java usw., die Arrays von 0 indiziert. Das bedeutet, dass in Ihrer Tabelle, die gültigen Indizes sind: 1, 2, 3, 4. Was Sie suchen, ist die folgende:

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

Wenn mit einem Argument aufgerufen, math.random(n) 1-n einschließlich eine zufällige ganze Zahl zurückgibt.

6

Ich denke, die Frage braucht auch eine allgemeinere Antwort. Es gibt keine Einschränkung für Lua-Tabellen, die mit einer Folge von ganzen Zahlen beginnend bei 1 erstellt werden. Schlüssel können wirklich alles sein - sie könnten sogar andere Lua-Tabellen sein! In solchen Fällen können Funktionen wie #myTable eine Antwort liefern, die Sie nicht erwarten (wenn sie ohne benutzerdefinierte Funktionen verwendet wird). Die einzige zuverlässige Art und Weise alle Schlüssel in einer Tabelle zu erhalten, ist darüber iterieren:

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

Ich werde auch hinzufügen, dass die ursprüngliche Lösung von Michal Kottman würde perfekt funktionieren, wenn alle Ihre Schlüssel eine Folge von Zahlen sind ab 1. Dies geschieht immer dann, wenn Sie eine Tabelle als myTable = {'a','b','c'} erstellen. Für Situationen, in denen Tabellen auf diese Weise erstellt werden, wäre es schneller, zufällige Elemente aus der Tabelle zu erhalten.