在 clojure 中有更多惯用的方法来做到这一点。比如这个:
您可以对初始集合生成无限的惰性随机更改序列,然后从中获取一个随机项。
(defn random-changes [items limit]
(rest (reductions #(assoc %1 (rand-int (count items)) %2)
(vec items)
(repeatedly #(rand-int limit)))))
在回复中:
user> (take 5 (random-changes '(1 2 3 4 5 6 7 8) 100))
([1 2 3 4 5 64 7 8] [1 2 3 4 5 64 58 8] [1 2 3 4 5 64 58 80]
[1 2 3 4 5 28 58 80] [1 2 3 71 5 28 58 80])
user> (nth (random-changes '(1 2 3 4 5 6 7 8) 100) 0)
[1 2 3 64 5 6 7 8]
并且您可以在您想要的索引处获取一个项目(因此这意味着带有index + 1 更改的集合)。
user> (nth (random-changes '(1 2 3 4 5 6 7 8) 100) (rand-int 3))
[1 46 3 44 86 6 7 8]
或只使用reduce 一次获取n 次更改的coll:
(defn random-changes [items limit changes-count]
(reduce #(assoc %1 (rand-int (count items)) %2)
(vec items)
(repeatedly changes-count #(rand-int limit))))
在回复中:
user> (random-changes [1 2 3 4 5 6] 100 3)
[27 2 33 4 76 6]
您也可以一次关联向量中的所有更改:
(assoc items 0 100 1 200 2 300),所以你可以这样做:
(defn random-changes [items limit changes-count]
(let [items (vec items)
rands #(repeatedly changes-count (partial rand-int %))]
(apply assoc items
(interleave (rands (count items))
(rands limit)))))
在回复中:
user> (random-changes [1 2 3 4 5 6] 100 3)
[1 65 61 44 5 6]