是否有更惯用的方法来获取Clojure中的N个随机元素?

时间:2013-08-19 14:42:05

标签: clojure idioms

我正在做这件事:(repeatedly n #(rand-nth (seq coll)))但我怀疑可能有更惯用的方式,原因有两个:

  • 我发现使用简短的匿名函数通常会有更简洁和富有表现力的替代方法,例如: partial
  • repeatedly的文档字符串“大概有副作用”,暗示它不是用来产生价值

我想我可以找到一种方法来使用reduce,但这似乎很棘手且效率较低,因为它必须处理整个集合,因为reduce不是懒惰的。

2 个答案:

答案 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)