f# - 从 F# 中的集合中获取随机子集

标签 f# random subset

我试图想出一种从 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/

相关文章:

f# - 将 list<byte[], int> 转换为 list<byte[]>

c - 从预填充的随机缓冲区中提取基 K 随机 “bits”

c - 生成一个介于 1 和 N-1 之间的随机数

r - 在R中使用另一个 bool 向量对向量进行子集化

r - 使用简单的代码按两个因子、所有级别进行子集化

r - 使用subset()时确定哪个列名导致 'undefined columns selected'错误

asp.net-core - 知道为什么在 F# 中跳过 C# 扩展调用吗?

c# - 从 C# 代码内部访问 F# List<List<>>

f# - 在 Mono 下运行 F# 3 生成的可执行文件

javascript - 从数组 Javascript 生成随机元素组