If you do not want to convert to an array, you can do something like this. This is O (n * m), where m is the size of the set.
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
source share