Иногда может понадобиться иметь набор случайных чисел в определенном промежутке без повторений значений
поэтому было придумано это чудовище
Lua code
---@param min integer
---@param max integer
---@param count integer|nil
function GetRandomIntTable(min, max, count)
local keys = {}
local out = {}
if min == max then return { min } end
if max < min then min, max = max, min end
local limit = math.abs(max - min) + 1
count = count == nil and limit or math.min(limit, count)
if limit <= count then
local ints = {}
for i = min, max do
table.insert(ints, i)
end
for _ = 1, limit do
table.insert(out, table.remove(ints, math.random(1, #ints)))
end
return out
else
while #out < count do
local i = math.random(min, max)
if keys[i] == nil then
keys[i] = true
table.insert(out, i)
end
end
return out
end
end
Использовать можно как
local a = GetRandomIntTable(1, 5, 10)
for i = 1, #a do
print(a[i])
end
где первое число минимальное значение, второе максимальное, третье количество значений
каждая ячейка таблицы будет содержать свою уникальную цифру в пределах значений и не больше чем их диапазон, например { 4, 1, 3, 5, 2 }.
функция GetRandomIntTable(min, max, count) может работать как GetRandomIntTable(200, 100, 5) так и как GetRandomIntTable(100, 200, 5) или GetRandomIntTable(100, 200), работает так же и с отрицательными значениями
Ред. PT153
Ред. KotoBog
Неужели там все так плохо?
{
$result = [];
while (count($result) < $count) {
$result[random_int($min, $max)] = 0;
}
return array_keys($result);
}
У тебя не могут быть 2 одинаковых ключа, а генерит оно именно их)
Просто похожую задачку как-то на собесе давали.
а. i = rand(1, top)
b. result[a] = Vals[i]
c. Vals[i] = Vals[top]
d. top = top - 1
Ред. KotoBog
Ред. nazarpunk
Ред. PT153