Создание списка из N различных случайных целых чисел

Если диапазон не задан, rand.Perm(count) возвращает count различных чисел от 0 до count−1 за O(count), без повторного подбора.

Короткий ответ

Что ответить на собеседовании

Если диапазон не задан, 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 до успеха без оценки заполненности не стоит.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее