Как уже отмечали другие, вы, вероятно, хотели бы использовать map
вместо iter
.Это будет работать, но это не будет особенно эффективной реализацией.Вот альтернативный способ реализовать его с использованием списочных представлений:
let randomSelect list toget =
[ let arr = list |> Array.ofList
for _ in 1 .. toget do
yield arr.[rng.Next(arr.Length)] ]
..., который также может быть написан с использованием функции map
, но я считаю синтаксис понимания более читабельным:
let randomSelect list toget =
let arr = list |> Array.ofList
[ 1 .. toget ] |> List.map (fun _ -> arr.[rng.Next(arr.Length)] )
Чтобы избежать проблем с индексацией, функция сначала преобразует список (заданный в качестве аргумента) в массив.Это будет более эффективно, если вам нужно взять большее количество элементов.Для меньшего числа элементов следует использовать только список и индексирование, используя List.nth
.
Затем фрагмент генерирует последовательность правильной длины (используя 1 .. toget
) и генерирует новый случайный элемент для каждого элемента.в этой входной последовательности.Значения из входной последовательности не нужны - они просто используются для генерации некоторой последовательности для начала.