2010-06-07 59 views
26

Mục tiêu của tôi là chọn một mục ngẫu nhiên từ một bảng trong Lua.Chọn một mục ngẫu nhiên từ một bảng

Đây là những gì tôi đã có cho đến nay, nhưng nó hiện không hoạt động:

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

Làm thế nào tôi có thể sửa chữa các mã trên để nó hoạt động như mong đợi? (Hoặc phương pháp nào khác tôi có thể sử dụng không?)

+1

Nghĩ rằng tôi sẽ thêm vào điều này. Có, theo mặc định chỉ mục đầu tiên trong mảng lua là 1. Tuy nhiên, bạn có thể bắt đầu bằng 0 như vậy: mảng = {[0] = 'a', 'b', 'c'} in (mảng [0 ]) >> a 'b' sẽ theo sau tại chỉ mục 1 và 'c' ở chỉ mục 2 ... – user3113401

Trả lời

2

Test:

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

cho nil. Tức là, 0 nằm ngoài giới hạn (hãy thử t[20]) ... do đó ngẫu nhiên phải từ 1 đến #myTable (bao gồm), vì vậy bạn có thể tự khắc phục.

55

Lua lập chỉ mục bảng từ 1, không giống như C, Java, v.v. chỉ mục mảng từ 0. Điều đó có nghĩa là trong bảng của bạn, các chỉ mục hợp lệ là: 1, 2, 3, 4. Điều bạn đang tìm kiếm là sau:

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

Khi được gọi với một đối số, math.random(n) trả về một số nguyên ngẫu nhiên 1-n bao gồm.

6

Tôi nghĩ câu hỏi này cũng cần câu trả lời chung hơn. Không có giới hạn trên các bảng lua được xây dựng với một chuỗi các số nguyên bắt đầu từ 1. Các phím có thể thực sự là bất cứ điều gì - chúng thậm chí có thể là các bảng lua khác! Trong những trường hợp như vậy, các hàm như #myTable có thể đưa ra một câu trả lời mà bạn không mong đợi (khi được sử dụng mà không có bất kỳ chức năng có thể tùy chỉnh nào). Cách duy nhất đáng tin cậy để có được tất cả các phím trong một bảng là để lặp qua nó:

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

Tôi cũng sẽ thêm rằng giải pháp ban đầu bằng cách Michal Kottman sẽ làm việc một cách hoàn hảo nếu tất cả các phím của bạn là một chuỗi các số bắt đầu từ 1. Điều này xảy ra bất cứ khi nào bạn tạo một bảng dưới dạng myTable = {'a','b','c'}. Vì vậy, đối với các tình huống mà các bảng được xây dựng theo cách này, việc nhận các phần tử ngẫu nhiên từ bảng sẽ nhanh hơn theo cách của anh ta.

Các vấn đề liên quan