F#set <string>中的随机元素

Mar*_*ark 2 random f# function setstring

我正在做一个项目,要求我编写一个从集合中选择指定数量的随机元素的函数。然后将这些元素映射到变量以供以后比较。

因此,在我的方案中,我必须选择任何给定集合的5%。

let rec randomSet (a:Set<string>) =
let setLength = (a.Count / 100) * 5

let list = []
let rand = System.Random
if set.Length <> setLength then
    // some code will go here
    randomSet setLength eIDS
else
    set
Run Code Online (Sandbox Code Playgroud)

^请批评我的代码,我只用F#编码一周。

我尝试递归地执行此操作,但是我感觉这是错误的方法。我尝试了其他方法,但是它们使用.take函数,因此每次返回的集合都是相同的。

有任何想法吗?我不是集合中的1个元素,而是集合中所有元素的5%。

这不是这样的问题:如何使用F#从列表中选择随机值

如果您认为是,请进行解释。

Tom*_*cek 5

有多种方法可以做到这一点。根据输入中元素的数量和要选择的项目数,不同的策略可能更有效。

可能最简单的方法是按随机数对输入进行排序,然后使用take来获取所需数量的元素:

let data = [| 0 .. 1000 |]

let rnd = System.Random()

data 
|> Seq.sortBy (fun _ -> rnd.Next())
|> Seq.take 50
Run Code Online (Sandbox Code Playgroud)

这将对序列进行随机排序(对于大序列可能会比较慢),但随后它会精确获取所需元素的数量(与Mark的解决方案不同,后者将返回大约5%的项目)。

如果要从较大的列表中选择较小的数字,则最好随机生成索引(确保没有重复项),然后根据索引进行直接查找。