Лучший способ генерировать случайные индексы в массив? - PullRequest
0 голосов
/ 09 ноября 2018

Добрый день. У меня есть набор значений, из которых я хотел бы нарисовать случайное подмножество.

Моя первая мысль была такая:

let getRandomIndices size count =
  if size >= count then
    let r = System.Random()
    r.GetValues(0,size) |> Seq.take count |> Seq.toList
  else
    [0..size-1]

Однако, r.GetValues ​​(0, размер) может генерировать одно и то же значение несколько раз. Как я могу получить разные значения? Моя первая мысль - многократно хранить индексы в наборе до тех пор, пока в наборе не будет задано нужное количество элементов. Но это кажется слишком процедурным / недостаточно функциональным? Есть ли лучший способ?

Или я должен начать с [0..size-1] и удалять из него случайные элементы, пока он не будет содержать нужные числовые индексы?

Я на самом деле не ищу самый эффективный подход, но самый функциональный. Я изо всех сил пытаюсь улучшить функциональное мышление.

1 Ответ

0 голосов
/ 09 ноября 2018

Если вы случайным образом сортируете список всех индексов, вы можете просто взять первое count количество элементов в списке.

let getRandomIndices size count =
  if size >= count then
    let r = System.Random()
    [0..size-1] |> List.sortBy (fun _ -> r.Next()) |> List.take count
  else
    [0..size-1]
...