Lua如何简化生成值互不相同的随机表的代码?
Lua 生成元素不重复的随机表解决方案
核心实现思路
通过封装通用生成函数,结合循环生成+哈希表去重的逻辑,不需要重复编写随机数生成代码,可灵活自定义生成表的长度、随机数取值范围。
可直接使用的代码实现
math.randomseed(tick()) -- 参数说明: -- length: 目标随机表的长度 -- min: 随机数最小值 -- max: 随机数最大值 local function generateUniqueRandomTable(length, min, max) local result = {} local existedNum = {} -- 用哈希表存储已生成的值,查重O(1)效率更高 while #result < length do local current = math.random(min, max) if not existedNum[current] then existedNum[current] = true table.insert(result, current) end end return result end -- 调用示例:生成4个0~100的不重复随机数 local MyTable = generateUniqueRandomTable(4, 0, 100) -- 如需生成30个元素的表,只需修改第一个参数:generateUniqueRandomTable(30, 0, 100) for i, v in ipairs(MyTable) do print(i.."- "..v) end
极简写法(单表生成场景,无需封装函数)
如果仅需要单次生成随机表,不需要复用逻辑,可以直接用短循环实现:
math.randomseed(tick()) -- 直接生成4个0~100的不重复随机表,修改<4>的数值即可调整表长度 local MyTable, exist = {}, {} while #MyTable < 4 do local n = math.random(0, 100) if not exist[n] then exist[n] = true MyTable[#MyTable+1] = n end end -- 输出逻辑不变 for i, v in ipairs(MyTable) do print(i.."- "..v) end
注意事项
- 之前的方案错误原因是仅在给
rand变量赋值时执行了一次math.random,后续所有引用都是同一个固定值,因此表内所有元素相同 - 使用时不要让目标表长度大于随机数取值范围的总元素数(比如要求生成102个0~100的不重复随机数是不可能的,会导致死循环),需满足
length <= max - min + 1
内容的提问来源于stack exchange,提问作者Epsilon544
相关产品推荐
相关产品推荐

