function - F# 集合中的随机元素 <string>

标签 function random f# 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

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

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

有什么想法吗?我不追求集合中的 1 个元素,我追求扔给它的任何集合的 5%。

这不是同一个问题:How can I select a random value from a list using F#

如果你认为是,请解释。

最佳答案

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

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

let data = [| 0 .. 1000 |]

let rnd = System.Random()

data 
|> Seq.sortBy (fun _ -> rnd.Next())
|> Seq.take 50

这将对序列进行随机排序(对于大型序列可能会很慢),但它会精确地获取您想要的元素数量(与 Mark 的解决方案不同,它将返回大约 5% 的项目)。

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

关于function - F# 集合中的随机元素 <string>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39253214/

相关文章:

c++ - 如何在多个类中使用友元函数

random - 如何在不引入偏差的情况下生成一个范围内的随机 Rust 整数?

将 "incomplete pattern match"视为错误的 F# 代码属性

f# - 如何使用 F# 3.0 类型提供程序生成 C# 友好的 .Net 4.0 兼容类型

language-agnostic - 函数参数最佳实践

c++ - c++中的多个return语句

javascript - 在javascript中将字符串转换为函数

python - 调试 : Shuffle deck of cards in Python/random

sql - 在 Access 或 SQL 中为每条记录创建一个随机 4 位数字?

function - F# int -> int 列表递归函数