lua - выбирает случайные значения из случайно выбранного ключа - PullRequest
1 голос
/ 08 марта 2019

Я пытаюсь случайным образом выбрать ключ из таблицы, а затем рандомизировать значение из этого случайного ключа.

Пример таблицы

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

Итак, четвертый.

Любая помощь будет потрясающей!

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Поскольку невозможно получить индекс таблицы, не задав ее предварительно или не собрав ее по индексу цикла, вы можете создать таблицу, которая содержит индекс каждой таблицы, а затем использовать ее для случайного выбора того, какой элемент использовать .

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

Фрагмент кода выполнения

0 голосов
/ 15 марта 2019

В этом фрагменте кода вы можете увидеть, как я продолжаю выбирать случайное значение в данной таблице. Это возвращает результат, который вы ищете.

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

Не стесняйтесь проверить это здесь

...