我还希望更改的值是随机的。例如
'(1 2 3 4 5)
一种可能的输出。
'(1 3 3 4 5)
另一个
'(1 5 5 4 5)
答案 0 :(得分:1)
在clojure中有更多惯用的方法可以做到这一点。例如这一个:
你可以为初始集合生成无限延迟的随机变化序列,然后从中获取一个随机项。
(defn random-changes [items limit]
(rest (reductions #(assoc %1 (rand-int (count items)) %2)
(vec items)
(repeatedly #(rand-int limit)))))
在repl中:
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次:
(defn random-changes [items limit changes-count]
(reduce #(assoc %1 (rand-int (count items)) %2)
(vec items)
(repeatedly changes-count #(rand-int limit))))
在repl中:
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)))))
在repl中:
user> (random-changes [1 2 3 4 5 6] 100 3)
[1 65 61 44 5 6]
答案 1 :(得分:0)
想出来。决定走更长的路线并发挥作用。
(defn changeSequence
[sequ x]
(def transsequ (into [] sequ))
(if (> x 0)
(changeSequence (assoc transsequ (rand-int (count transsequ)) (rand-int foo)) (dec x))
(seq sequ)
))