lua — Выбор случайных значений из случайно выбранного ключа

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