4

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

  • 我发现使用短匿名函数通常有更简洁和更具表现力的替代方法,例如partial
  • 的文档字符串repeatedly说“可能有副作用”,暗示它不打算用于产生值

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

4

2 回答 2

6

一个简单但不适用于大型收藏的解决方案可能是:

(take n (shuffle coll))

具有不重复元素的“优势”。你也可以实现一个惰性洗牌,但它会涉及更多的代码。

于 2013-08-19T15:07:14.043 回答
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)
于 2013-08-21T13:58:40.517 回答