如何从LUA表中选择多个随机元素?

我正试图弄清楚如何随机选择表中的多个条目。

这是我目前有的:


local letters = {"w", "x", "y", "z"}

function randomletterselect()
    local randomletters = {}

    for i,v in pairs(letters) do
        table.insert(randomletters,i)
    end
    local letter = letters[randomletters[math.random(#randomletters)]]
    --将多个选定的单词设置为新表?

end
randomletterselect()

这里的代码可以从表中选择一个随机元素(letter)。本质上,当我运行此代码时,我想要选择多个随机字母。例如,有时它可能选择x、y,另一次可能是x、y、z。

我发现最接近的答案实际上就是我已经想出来的,在这篇帖子中在LUA中从表中随机选择一个键值

点赞
用户11740758
用户11740758

你可以使用以下代码选择随机小写字母:

randomletterselect=function()
local chars={}
for i=65,math.random(65,90) do
  table.insert(chars,string.char(math.random(65,90)):lower())
end
print(table.concat(chars,','))
return chars
end

randomletterselect()

这个版本会返回一个没有重复的表格:

randomletterselect=function()
local chars=setmetatable({},{__name='randomletters'})
for i=65,90 do
  table.insert(chars,string.char(i):lower())
end
for i=1,math.random(#chars) do
 table.remove(chars,math.random(#chars))
end
print(#chars,table.concat(chars,','))
return chars
end
2021-07-10 19:15:56
用户16388755
用户16388755
local tbl = {'a', 'b', 'c', 'd'} -- 在此处输入你的字符

local MIN_NUM, MAX_NUM = 1, 2 ^ #tbl - 1
-- 如果表的长度发生了改变,MAX_NUM也会随之改变

math.randomseed(os.time())

local randomNum = math.random(MIN_NUM, MAX_NUM)

local function getRandomElements(num)
    local rsl = {}
    local cnt = 1

    while num > 0 do
        local sign = num % 2 -- 转换为二进制
        -- 如果数字是0b1010,sign将会是0101

        num = (num - sign) / 2

        if sign == 1 then
            local idx = #rsl + 1
            -- 使用 tbl[#tbl + 1] 扩展表(数组)

            rsl[idx] = tbl[cnt]
        end

        cnt = cnt + 1
    end

    return table.concat(rsl)
end

print(getRandomElements(randomNum))

我有另一种解决问题的方法,请尝试使用。
MIN_NUM 应该为1,因为当其为0时,getRandomElements 将返回一个空字符串。
2021-07-11 07:37:40