генерировать не повторяющиеся целые числа в Lua - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь сгенерировать 5 случайных неповторяющихся значений между 0,500 и назначить их 5 переменным, используя Lua.

До сих пор я использовал следующий код, который безуспешно пытается генерировать случайные числа и присваивает значения. Проблема:

  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 

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

Обычный подход для такого рода вещей состоит в том, чтобы сделать случайное перемешивание массива, содержащего все возможные случайные числа, и взять первые 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
0 голосов
/ 31 октября 2018

Если вы ищете простой ответ без метатаблиц ..

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
0 голосов
/ 30 октября 2018

Вот решение, уточненное в комментариях:

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 Name = "x-"
for i =1, 5 do
  X = my_random (t, 0, 500)
  v_Name = Name .. i    -- oh, may be use a table?
  print (v_Name, "=" ,X)
 end 
...