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#从列表中选择随机值
如果您认为是,请进行解释。
有多种方法可以做到这一点。根据输入中元素的数量和要选择的项目数,不同的策略可能更有效。
可能最简单的方法是按随机数对输入进行排序,然后使用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%的项目)。
如果要从较大的列表中选择较小的数字,则最好随机生成索引(确保没有重复项),然后根据索引进行直接查找。