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

Можно сгенерировать случайную перестановку диапазона [0, n): это гарантирует уникальность за O(n), без циклов повторного подбора.

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

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

Можно сгенерировать случайную перестановку диапазона [0, n): это гарантирует уникальность за O(n), без циклов повторного подбора.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать функцию uniqRandn, которая возвращает срез длиной n, состоящий из различных случайных целых чисел.

import (
        "fmt"
        "math/rand"
        )

fucn main () {
    fmt.Println(uniqRandn(10))
}

func uniqRandn(n int) []int {
    
}

Функция должна гарантировать отсутствие дублирующихся элементов в результирующем срезе, используя генератор случайных чисел для получения каждого значения.

Ответ

Можно сгенерировать случайную перестановку диапазона [0, n): это гарантирует уникальность за O(n), без циклов повторного подбора.

Диапазон значений в задаче не задан, поэтому выберем n различных чисел от 0 до n−1 и перемешаем их алгоритмом Фишера—Йетса:

func uniqRandn(n int) []int {
    if n < 0 { panic("n must be non-negative") }
    values := make([]int, n)
    for i := 0; i < n; i++ {
        j := rand.Intn(i + 1)
        values[i] = values[j]
        values[j] = i
    }
    return values
}

Используется пакет math/rand. На шаге i выбирается случайное место для нового значения без потери старых, поэтому повторов нет. Это не выборка из всего диапазона int и не криптографическая генерация. В исходнике дополнительно исправляется опечатка fucn на func.

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

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

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

Подробнее