2016-03-07 63 views
0

我有一些较大程序的代码。这部分产生一个范围内的随机数并检查重复。我已经放置了打印语句来帮助处理范围问题。如果检测到重复,我想要生成一个新的随机数。代码的作品,但我认为一个经验程序员会笑它如何无能为力。所以我希望得到一些关于如何改进这些代码的指导。低效代码:防止产生重复的随机数

Code Extract

+1

你可能想借此来的[代码审查(http://codereview.stackexchange.com/)站点。 – cbay

+0

目前提出的这个问题在代码审查中是无关紧要的,因为要审查的代码必须包含在问题_中(而不是它的屏幕截图/图像)。除此之外,如果代码按预期工作并且作者正在寻求改进,Code Review将是适当的。 – Phrancis

回答

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 
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 
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列表替换为存储分组数字的列表列表。通过这样做,您可以减少需要检查的项目数量。 下面是组号使用地板()的一个例子

//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