将序列中的1-3个随机索引更改为随机值

时间:2016-02-08 01:45:52

标签: clojure sequence

我还希望更改的值是随机的。例如

'(1 2 3 4 5)

一种可能的输出。

'(1 3 3 4 5)

另一个

'(1 5 5 4 5)

2 个答案:

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