【问题标题】:Randomize numbers in Lua with no repeats在 Lua 中随机化数字,不重复
【发布时间】:2013-04-20 12:19:36
【问题描述】:

我正在 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”越来越高,而且它会停止。我猜这是因为随机数生成器无法获得“nil”的 rndom[num]。我的意思是,赔率是多少?我想改善它的运行时间。谁能为我的问题提出更好的解决方案?

谢谢!

【问题讨论】:

    标签: random lua


    【解决方案1】:

    最好生成具有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
    

    【讨论】:

    • 哇。做到了!它确实使运行时间更快。非常感谢。
    【解决方案2】:

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

    【讨论】:

    • 哦。您是指重复的随机数字的下一个数字?
    • 没错。所以,如果你随机5个,标记它。在你再次随机 5 之后,尝试 6 是否被拿走了。如果没有,请将其退回。只要记住在达到最大值后包装即可。
    猜你喜欢
    • 2014-05-01
    • 2014-01-19
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多