Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 将序列中的1-3个随机索引更改为随机值_Clojure_Sequence - Fatal编程技术网

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

Clojure 将序列中的1-3个随机索引更改为随机值,clojure,sequence,Clojure,Sequence,我还希望更改的值是随机的。比如说 '(1 2 3 4 5) 一个可能的输出 '(1 3 3 4 5) 另一个 '(1 5 5 4 5) 我明白了。决定走更长的路,做一个功能 (defn changeSequence [sequ x] (def transsequ (into [] sequ)) (if (> x 0) (changeSequence (assoc transsequ (rand-int (count transsequ)) (rand-int foo)) (dec x

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

'(1 2 3 4 5)
一个可能的输出

'(1 3 3 4 5)
另一个

'(1 5 5 4 5)

我明白了。决定走更长的路,做一个功能

(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)
))

在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
更改的集合)

或者只需使用
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]
user> (random-changes [1 2 3 4 5 6] 100 3)
[1 65 61 44 5 6]
您还可以一次关联向量中的所有更改:
(关联项目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)
[27 2 33 4 76 6]
user> (random-changes [1 2 3 4 5 6] 100 3)
[1 65 61 44 5 6]

你试过什么?我知道如何使用rand-int。Assoc对序列不起作用。我尝试过替换和更新,但这些也不能用这种方式处理序列。也许。。。我不太确定…没有一条赛后行走不适用于序列。谢谢。有什么东西阻止你使用向量而不是序列吗?向量与函数中的
assoc
一起工作
def
是一种不好的形式。每次调用
changeSequence
时,您是否都试图重新定义
transsequ
?在CamelCase中命名函数的形式也很糟糕,使用小写和连字符标点符号(即
(defn change sequence[…])
)更为惯用。感谢您向我展示了一种更合适的解决方法:clojure。我确实要求像我下面这样的顺序输出解决方案。这是我的主要问题。我想我可以通过调用将其转换为向量来解决这个问题,然后将其输入到这个函数中,然后再重新转换它。