Если диапазон не задан, rand.Perm(count) возвращает count различных чисел от 0 до count−1 за O(count), без повторного подбора.
Создание списка из N различных случайных целых чисел
Если диапазон не задан, rand.Perm(count) возвращает count различных чисел от 0 до count−1 за O(count), без повторного подбора.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать функцию, которая возвращает N уникальных целых чисел в виде среза ([]int).
Требования:
- При генерации использовать пакет
math/rand(например,rand.Int()). - В полученном срезе не должно быть повторяющихся значений.
- Решение должно быть эффективно при больших значениях N, то есть избегать бесконечных или слишком длительных циклов при подборе новых чисел.
Пример сигнатуры функции: func GenerateUnique(count int) []int.
Важно: сохраняйте все упомянутые элементы кода без изменений, меняйте только формулировки и названия переменных в тексте.
Ответ
Если диапазон не задан, rand.Perm(count) возвращает count различных чисел от 0 до count−1 за O(count), без повторного подбора.
Условие не требует большого случайного диапазона, поэтому случайная перестановка решает задачу без риска затяжного поиска очередного уникального числа.
import "math/rand"
func GenerateUnique(count int) []int {
if count < 0 {
panic("count must be non-negative")
}
return rand.Perm(count)
}
Время и память — O(count). Это псевдослучайность, не криптографическая генерация. Если требуются числа из заданного диапазона [0, M), нужно дополнительно проверить count ≤ M и выбрать алгоритм выборки без возвращения; повторять rand.Int до успеха без оценки заполненности не стоит.