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