2010-06-07 21 views
26

Moim celem jest wybranie losowego przedmiotu ze stołu w Lua.Wybierz losowy przedmiot ze stołu

To, co mam tak daleko, ale w tej chwili nie działa:

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

Jak mogę rozwiązać powyższy kod tak, że działa zgodnie z przeznaczeniem? (Lub inny sposób, który mógłby użyć?)

+1

Myślałem, że dodam do tego. Tak, domyślnie pierwszym indeksem w tablicy lua jest 1. Można jednak zacząć od 0, tak: array = {[0] = 'a', 'b', 'c'} print (array [0] ]) >> a "b" będzie następowało po indeksie 1, a "c" w indeksie 2 ... – user3113401

Odpowiedz

2

Test:

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

daje nil. Oznacza to, że 0 jest poza granicami (spróbuj t[20]) ... więc losowe musi być od 1 do #myTable (włącznie), więc możesz to naprawić samodzielnie.

55

Lua indeksuje tabele od 1, w przeciwieństwie do C, Java itd., Która indeksuje tablice od 0. Oznacza to, że w twojej tabeli poprawne indeksy to: 1, 2, 3, 4. To, czego szukasz, to następujący:

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

Wywołuje się jeden argument math.random(n) powraca losową liczbę całkowitą od 1 do n tym.

6

Myślę, że pytanie również wymaga bardziej ogólnej odpowiedzi. Nie ma ograniczeń na to, że tablice lua będą budowane z sekwencją liczb całkowitych zaczynając od 1. Klucze mogą być naprawdę wszystkim - mogą to być nawet inne tablice Lua! W takich przypadkach funkcje takie jak #myTable mogą dać odpowiedź, której się nie spodziewasz (jeśli jest używana bez niestandardowej funkcji metatabilnej). Jedyny niezawodny sposób, aby uzyskać wszystkie klucze w tabeli jest iteracyjne nad nim:

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

będę również dodać, że oryginalne rozwiązanie przez Michal Kottman będzie działać prawidłowo, jeżeli wszystkie klucze są ciągiem liczb rozpoczynających się od 1. Dzieje się tak, gdy tworzysz tabelę jako myTable = {'a','b','c'}. Tak więc w sytuacjach, gdy tabele są budowane w ten sposób, pobieranie losowych elementów ze stołu byłoby szybsze.