使用键值对数组构造的无重复随机数算法

-- @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.

posted @ 2022-12-26 00:26  叁仟月  阅读(45)  评论(0编辑  收藏  举报