【问题标题】:generate non duplicate integers in Lua在 Lua 中生成不重复的整数
【发布时间】:2019-04-03 03:28:51
【问题描述】:

我正在尝试在 0,500 之间生成 5 个随机非重复值,并使用 Lua 将它们分配给 5 个变量。

到目前为止,我已使用以下代码尝试生成随机数并分配值,但未成功。问题是:

  1. 此代码有时会生成重复的数字
  2. 我想要看起来像 x-1、x-2 等的名称,打印成 x-1、x-12。

你能帮我解决这个问题吗?

例子:

v_Name = "x-"
for i =1, 5 do
  X = math.random (0, 500)
  v_Name = v_Name..(i)
  print (v_Name)
  print (X)
 end 

【问题讨论】:

    标签: random lua unique


    【解决方案1】:

    这是一个解决方案,已在 cmets 中阐明:

    math.randomseed( os.time() ) -- first, sets a seed for the pseudo-random generator
    
    local  function my_random (t,from, to)  -- second, exclude duplicates
       local num = math.random (from, to)
       if t[num] then  num = my_random (t, from, to)   end
       t[num]=num 
       return num
    end
    
    local t = {}    -- initialize  table with not duplicate values
    local v_Name = "x-"
    for i =1, 5 do
      X = my_random (t, 0, 500)
      v_Name = v_Name .. i    -- It is better to use the table here and concatenate it after..
      print (v_Name, "=" ,X)
     end 
    

    【讨论】:

    • 如果循环计数大于随机数的范围,t 将溢出。但这不是这里的意图。您不能在 [0-500] 之间生成 501 个随机数;)但应该对此进行检查。我会在我的实用程序中添加这个,谢谢
    • 为了避免循环而滥用递归的有趣示例 :-)
    【解决方案2】:

    这类事情的常用方法是对包含所有可能随机数的数组进行随机洗牌,然后取其中的第一个 n。作为一种优化,您只能随机播放您需要的第一个 n 元素。

    local meta = {
      __index = function( _, i ) return i end
    }
    
    local function random_n( n, i, j )
      local result = {}
      local temp = setmetatable( {}, meta )
      for k = 1, n do
        -- swap first element in range with randomly selected element in range
        local idx = math.random( i, j )
        local v = temp[ idx ]
        temp[ idx ] = temp[ i ]
        result[ k ] = v
        i = i + 1 -- first element in range is fixed from now on
      end
      return result
    end
    
    math.randomseed( os.time() )
    
    local t = random_n( 5, 0, 500 )
    for i,v in ipairs( t ) do
      print( i, v )
    end
    

    【讨论】:

      【解决方案3】:

      如果您正在寻找没有元表的简单答案..

      local result = {}
      local rand_num = {}
      local v_Name = "x-"
      
      for i=1, 500, 1 do
      table.insert(rand_num, i)
      end
      
      for i=1, 5, 1 do
      local r = math.random(1, #rand_num)
      table.insert(result, rand_num[r])
      table.remove(rand_num, r)
      end
      
      for i,v in pairs(result) do
      print(v_Name .. v)
      end
      

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2012-03-16
        • 2012-05-27
        • 2019-09-22
        • 1970-01-01
        • 2019-04-14
        相关资源
        最近更新 更多