Lua中生成不重复整数

我正在尝试使用Lua生成5个介于0、500之间的不重复随机值,并将它们分配给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
点赞
用户7504558
用户7504558

以下是在评论中进行澄清的解决方案:

math.randomseed(os.time()) -- 首先为伪随机生成器设置一个种子

local function my_random(t, from, to) -- 其次,排除重复项
  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 = {} -- 初始化一个不包含重复值的表
local v_Name = "x-"
for i = 1, 5 do
  X = my_random(t, 0, 500)
  v_Name = v_Name .. i -- 最好在这里使用表,然后进行连接..
  print(v_Name, "=", X)
end
2018-10-30 06:50:40
用户3677376
用户3677376

通常的做法是对包含所有可能的随机数的数组进行随机洗牌,然后取其中的前 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
    -- 将范围内的第一个元素与范围内的一个随机选中的元素交换位置
    local idx = math.random( i, j )
    local v = temp[ idx ]
    temp[ idx ] = temp[ i ]
    result[ k ] = v
    i = i + 1 -- 范围内的第一个元素从此固定
  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
2018-10-31 09:04:36
用户8425022
用户8425022

如果你正在寻找一个不用元表的简单答案...

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
2018-10-31 13:36:48
用户20845554
用户20845554

我是Lua的新手 以下是我的尝试,没有使用math.random函数也能正确给出答案。顺便问一下,我们真的需要使用这个函数吗?

local count = 0
local v_name = ""

for count = 1, 10 do
    v_name = v_name.. "x-" .. count.. " "
end
print (v_name)
2022-12-23 07:48:59