#lua #lua-table
#lua #lua-таблица
Вопрос:
Я пытаюсь случайным образом выбрать ключ из таблицы, а затем также рандомизировать значение из этого случайного ключа.
Пример таблицы
items = {
["Rock"] = {min = 1, max = 5},
["Sand"] = {min = 4, max = 12},
["Glass"] = {min = 20, max = 45},
}
Затем эта функция
function printTable()
local keys = {}
for k,v in pairs(items) do
table.insert(keys, k)
local keys = keys[math.random(1, #keys)]
local amount = math.random(v.min,v.max)
print(item, amount)
end
end
Он печатает случайный ключ со своими значениями, но затем он печатает больше случайных ключей с меньшим количеством значений, которые с ним не сочетаются.
Что я хочу сделать, так это напечатать один из ключей, а затем только значения для указанного ключа, чтобы,
Sand 6
или
Glass 31
Итак, в-четвертых.
Любая помощь была бы потрясающей!
Комментарии:
1. В вашем примере ошибка. вместо этого вы печатаете (
item
, amount)k
. после изменения этого я получил желаемый результат. Камень 3 Песок 11 Стекло 32. Также ваш метод случайного извлечения элемента может быть не таким случайным, как хотелось бы2. Есть советы по тому, как сделать его более случайным? Кроме того, я намерен напечатать только 1 ключ и его назначенные значения. Вместо всех 3 или нескольких ключей.
3. Используйте
math.randomseed()
для создания действительно случайных чисел
Ответ №1:
Поскольку нет способа получить индекс таблицы без ее предварительного определения или сбора с помощью индекса цикла, вы могли бы создать таблицу, которая содержит индекс каждой таблицы, а затем использовать это для случайного выбора того, какой элемент использовать.
local indexes = {"Rock", "Sand", "Glass"}
Используйте это с вашей printTable
функцией.
items = {
["Rock"] = {min = 1, max = 5},
["Sand"] = {min = 4, max = 12},
["Glass"] = {min = 20, max = 45},
}
local indexes = {"Rock", "Sand", "Glass"}
function printTable()
math.randomseed(os.time())
local index = indexes[math.random(1, 3)] -- Pick a random index by number between 1 and 3.
print(index .. " " .. math.random(items[index].min, items[index].max))
end
Комментарии:
1. Вы должны учитывать действительно случайные числа с
math.randomseed()
Ответ №2:
В этом фрагменте кода вы можете видеть, как я продолжаю выбирать случайное значение в данной таблице. Это возвращает результат, который вы ищете.
math.randomseed(os.time())
local items = {
["Rock"] = {min = 1, max = 5},
["Sand"] = {min = 4, max = 12},
["Glass"] = {min = 20, max = 45},
}
local function chooseRandom(tbl)
-- Insert the keys of the table into an array
local keys = {}
for key, _ in pairs(tbl) do
table.insert(keys, key)
end
-- Get the amount of possible values
local max = #keys
local number = math.random(1, max)
local selectedKey = keys[number]
-- Return the value
return selectedKey, tbl[selectedKey]
end
local key, boundaries = chooseRandom(items)
print(key, math.random(boundaries.min, boundaries.max))
Не стесняйтесь протестировать это здесь
Комментарии:
1. Хорошо, Но что сделать, чтобы получить больше возможностей? Я имею в виду ваш код, поместите его в rvchk. lua и do
for i=0,10 do; dofile 'rvchk.lua'; i=i 1; end;
— Это приводит к одиннадцати одинаковым результатам. Я имею в виду, что всем нам здесь нужно лучшее решение дляmath.randomseed(os.time())