Можно сгенерировать случайную перестановку диапазона [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.