低效代码:防止生成重复的随机数

我有一些来自某个大型程序的代码。此部分在指定范围内生成随机数并检查是否有重复值。我添加了一些打印语句以帮助确定作用域。如果检测到重复值,我希望生成一个新的随机数。虽然代码能够使用,但我认为一个有经验的程序员会对其执行效率感到不满意。因此,我希望得到一些关于如何改进此代码的指导。

代码片段

点赞
用户1847592
用户1847592
准备一组可以选择的数字
local r = {}
for i = c-8, c+12 do
   table.insert(r, i)
end
从集合中选择一些数字
for i = 1, #options do
   options[i] = table.remove(r, math.random(#r))
end
保证 options[] 不包含重复的数字
2016-03-07 21:29:47
用户5699329
用户5699329

以下是在你只需要从大型数据集中获取少量数字并将它们放入 options 中的替代方案。在这种情况下,它可能比 Egor 的方法稍微快一些。 对于以下内容,请假设随机数在整数 A 和整数 B 之间,并且您正在寻找 C 个唯一数字:

options = {}
local taken = {}
for i = 1,C do
  repeat
    options[i] = math.random(A,B)
  while taken[options[i]] ~= nil
  taken[options[i]] = true
end
2016-03-12 22:15:38
用户5751739
用户5751739

你可以通过设置一个数组来记录数字是否已经被添加过来改进它。下面是一份示例的伪代码。

//创建一个长度为可能数字数量的列表
numAddedState <- createList((upperBound-lowerBound+1),false)

generatedNums <- []

while length(generatedNums) < requiredLength {
    num <- random(lowerBound, upperBound)
    if (numAddedState[num - lowerBound]) {
        //将数字添加到列表中,并将该数字的添加状态更改为 true
        generatedNums.append(num)
        numAddedState[num - lowerBound] <- true
    }
    else {
        print(num + " is dup")
    }
}
return generatedNums

如果你需要生成浮点数,你可以用一个列表去存储分组的数字来代替 numAddedState 列表。这样可以减少需要检查的项数。 以下是一个使用 floor() 分组数字的示例。

//创建一个长度为可能数字数量的列表,其默认值为一个空列表
numsAdded <- createList((floor(upperBound)-floor(lowerBound+1)),[])

generatedNums <- []

while length(generatedNums) < requiredLength {
    num <- random(lowerBound, upperBound) //生成浮点数
    for numbers in numsAdded[floor(num)] {
        if numbers == num {
            print(num + " is dup")
            continue
        }
    }

    numsAdded[floor(num)].append(num)
    generatedNums.append(num)
}
return generatedNums
2016-03-13 11:59:19