使用键值对数组构造的无重复随机数算法
-- @param list_length 生成的数组长度
-- @param max_random_length 随机数的最大范围
math.generate = function (list_length, max_random_length)
local random = {}
local random_list = {}
-- 输出随机数表, 通过判断是否存在随机数键避免重复随机数
for i = 1, list_length do
local random_number = math.random(1, max_random_length)
-- 当存在该随机数时, 重复随机至不重复
while random[random_number] do
random_number = math.random(1, max_random_length)
end
random[random_number] = true
end
for key, value in pairs(random) do
table.insert(random_list, key)
end
return random_list
end
在上面的函数math.generate
中, 需要传入两个参数: 随机数表的长度list_length
和最大随机数max_random_length
. 返回1个没有重复值的随机数表.
由于lua的table本质上是键值对动态数组, 所以(line 14)可以直接将随机出来的数字random_number
传入key中, 这样就表示这个随机数已经有了, 后续再随机出相同的随机数就会进入(line 11)的循环中去再次随机.
这样做的好处是, 不用和按顺序填充随机数表时, 每随机出一个值就需要和前面的所有值进行遍历查询, 这种随机数生成方式只需要比对一次就知道是否重复, 极大减少了时间复杂度.
最后, 通过pairs
迭代器遍历出random
所有的键(随机数)就构成了一个新的无重复随机数组random_list
.