我有一系列项目,我想从中取样。
我的印象是 Set 是一个很好的采样结构,在折叠中我会返回原始或修改后的集合,而检索到的元素会丢失,这取决于我是否想要替换 not。但是,似乎没有直接从 Set 中检索元素的方法。
有什么我想念的吗?或者我应该使用一组索引,以及一个随机开始position < Set.count
并上升直到找到一个成员的代理函数?
也就是说,沿着这条线
module Seq =
let modulo (n:int) start =
let rec next i = seq { yield (i + 1)%n ; yield! next (i+1)}
next start
module Array =
let Sample (withReplacement:bool) seed (entries:'T array) =
let prng, indexes = new Random(seed), Set(Seq.init (entries |> Array.length) id)
Seq.unfold (fun set -> let N = set |> Set.count
let next = Seq.modulo N (prng.Next(N)) |> Seq.truncate N |> Seq.tryFind(fun i -> set |> Set.exists ((=) i))
if next.IsSome then
Some(entries.[next.Value], if withReplacement then set else Set.remove next.Value set)
else
None)
编辑:积极跟踪我给的东西,而不是跟踪我仍然可以给的东西,这会使它更简单、更有效。