我试图想出一种从 F# 中的集合中获取随机子集的优雅方法
对此有何想法?
也许这会起作用:假设我们有一组 2x 元素,我们需要选择 y 元素的子集。然后,如果我们可以生成一个 x 大小的位随机数,它恰好包含 y 2n 次幂,我们实际上就有了一个带有 y 个孔的随机掩码。我们可以继续生成新的随机数,直到我们得到第一个满足这个约束的随机数,但有没有更好的方法?
最佳答案
如果你不想转换为数组,你可以做这样的事情。这是 O(n*m),其中 m 是集合的大小。
open System
let rnd = Random(0);
let set = Array.init 10 (fun i -> i) |> Set.of_array
let randomSubSet n set =
seq {
let i = set |> Set.to_seq |> Seq.nth (rnd.Next(set.Count))
yield i
yield! set |> Set.remove i
}
|> Seq.take n
|> Set.of_seq
let result = set |> randomSubSet 3
for x in result do
printfn "%A" x
关于f# - 从 F# 中的集合中获取随机子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123958/