我目前正在这样做:(repeatedly n #(rand-nth (seq coll)))
但我怀疑可能有一种更惯用的方式,原因有两个:
- 我发现使用短匿名函数通常有更简洁和更具表现力的替代方法,例如
partial
- 的文档字符串
repeatedly
说“可能有副作用”,暗示它不打算用于产生值
我想我可以找到一种使用方法,reduce
但这似乎很棘手且效率较低,因为它必须处理整个集合,因为reduce
它并不懒惰。
一个简单但不适用于大型收藏的解决方案可能是:
(take n (shuffle coll))
具有不重复元素的“优势”。你也可以实现一个惰性洗牌,但它会涉及更多的代码。
我知道这不是您要问的——但如果您正在进行大量抽样和统计工作,您可能会对 Incanter ( [incanter "1.5.2"]
) 感兴趣。Incanter 提供了函数sample
,它提供了样本大小和替换的选项。
(require '[incanter.stats :refer [sample]]))
(sample [1 2 3 4 5 6 7] :size 5 :replacement false)
; => (1 5 6 2 7)