我正在做这件事:(repeatedly n #(rand-nth (seq coll)))
但我怀疑可能有更惯用的方式,原因有两个:
partial
repeatedly
的文档字符串“大概有副作用”,暗示它不是用来产生价值我想我可以找到一种方法来使用reduce
,但这似乎很棘手且效率较低,因为它必须处理整个集合,因为reduce
不是懒惰的。
答案 0 :(得分:5)
对于大型馆藏来说,一个简单的解决方案可能是:
(take n (shuffle coll))
具有不重复元素的“优势”。你也可以实现一个lazy-shuffle,但它会涉及更多的代码。
答案 1 :(得分:1)
我知道这并不是你所要求的 - 但如果你正在做大量的抽样和统计工作,你可能会对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)