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