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

时间:2016-03-07 18:03:40

标签: random lua duplicates

我有一些来自更大程序的代码。此部分生成一个范围内的随机数并检查重复项。我已经放置了print语句来帮助处理范围。如果检测到重复,我想要生成一个新的随机数。代码有效,但我认为一个体验程序员会嘲笑它是多么无能为力。因此,我希望能够就如何改进此代码提供一些指导。

Code Extract

3 个答案:

答案 0 :(得分:1)

-- prepare set of numbers to choose from
local r = {}
for i = c-8, c+12 do
   table.insert(r, i)
end
-- take some numbers from the set
for i = 1, #options do
   options[i] = table.remove(r, math.random(#r))
end
-- options[] is guaranteed to not contain duplicates

答案 1 :(得分:0)

这是一种替代选择,当你只是从一个大集合中提取一些数字并将它们放在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

答案 2 :(得分:0)

您可以通过设置数组来记录是否已添加数字来改进它。这是一个伪代码示例。

//create a list whichs length is the num of possible numbers
numAddedState <- createList((upperBound-lowerBound+1),false)

generatedNums <- []

while length(generatedNums) < requiredLength {
    num <- random(lowerBound, upperBound)
    if (numAddedState[num - lowerBound]) {
        //add the number into list and change the added state of this number to true
        generatedNums.append(num)
        numAddedState[num - lowerBound] <- true
    }
    else {
        print(num + " is dup")
    }
}
return generatedNums

如果需要生成浮点数,可以将numAddedState列表替换为列表,列表存储分组数字。通过这样做,您可以减少需要检查的项目数量。 以下是使用floor()

对组号进行分组的示例
//create a list whichs length is the num of possible numbers and default value is an empty list
numsAdded <- createList((floor(upperBound)-floor(lowerBound+1)),[])

generatedNums <- []

while length(generatedNums) < requiredLength {
    num <- random(lowerBound, upperBound) //generate float point number
    for numbers in numsAdded[floor(num)] {
        if numbers == num {
            print(num + " is dup")
            continue
        }
    }

    numsAdded[floor(num)].append(num)
    generatedNums.append(num)
}
return generatedNums