将随机索引生成到数组中的最佳方法?

Best way to generate random indices into an array?

下午好。我有一组值,我想从中抽取一个随机子集。

我的第一个想法是:

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,size) 可能会多次生成相同的值。我怎样才能得到不同的价值?我的第一个想法是重复将索引存储到一个集合中,直到该集合包含所需数量的元素?不过这个好像也太procedural/not-functional了吧?有没有更好的方法?

或者我应该从 [0..size-1] 开始并从中删除随机元素直到它包含所需的数字索引?

我并不是在寻找最有效的方法,而是最实用的方法。我正在努力更好地理解功能性思维方式。

如果您对所有索引的列表进行随机排序,您可以只取列表中的前 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]