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

3

下午好。我有一组值,想要从中随机选择一个子集。

我的第一个想法是:

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) 可能会多次生成相同的值。我该如何获取不同的值?我的第一个想法是重复将索引存储到集合中,直到集合包含所需数量的元素?但这似乎过于程序化/非函数化?是否有更好的方法?
或者,我应该从 [0..size-1] 开始,并删除其中的随机元素,直到它包含所需数量的索引?
我并不是真的在寻找最有效的方法,而是最功能化的方法。我正在努力更好地理解函数式思维方式。
1个回答

3

如果您随机排序索引列表,只需取列表中的前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]

美妙!这就是我需要做的思考方式。 - StevePoling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接