Random 在Lua中随机化数字,不重复

Random 在Lua中随机化数字,不重复,random,lua,Random,Lua,我在Lua做一个项目,它涉及到不重复的随机数字。这是我的密码 for i = 1, 86000 do while rndom[num] ~= nil do num = math.random(1,95000) end rndom[num] = num for k=1, 11 do file2:write(input[num][k], " ") end file2:write("\n") end 基本上,它

我在Lua做一个项目,它涉及到不重复的随机数字。这是我的密码

for i = 1, 86000 do
    while rndom[num] ~= nil do
        num = math.random(1,95000)
     end
     rndom[num] = num
     for k=1, 11 do
        file2:write(input[num][k], " ")
     end
     file2:write("\n")
end
基本上,它将一个值放入rndom[num],这样当随机数重复且rndom[num]~=nil时,它将再次随机数。我的问题是,随着我的“i”越来越高,加载的时间太长了,总有一天它会停止。我猜这是因为随机化器不能得到一个rndom[num]为“nil”。我是说,什么是正确的?我想提高它的运行时间。谁能为我的问题提出更好的解决方案


谢谢

一个简单的解决方案是,当您获得已有变量时,不再使用
随机
,而是尝试返回下一个可用变量。这样,您就可以保证有
O(N^2)
运行时间(最大)。

最好生成时间复杂度为
O(N)
的置换

local n = 95000

local t = {}
for i = 1, n do
   t[i] = i
end

for i = 1, 86000 do
   local j = math.random(i, n)
   t[i], t[j] = t[j], t[i]
   for k = 1, 11 do
      file2:write(input[t[i]][k], " ")
   end
   file2:write"\n"
end

哦你是说随机数重复的下一个数?没错。所以,如果你随机抽取5个,标记它。在你再次随机选择5次后,如果选择了6次,试试看。如果没有,请退回。只要记得在达到最大值后再包装就行了。哇。成功了!这无疑加快了跑步速度。非常感谢你。