【问题标题】:Changing 1-3 random index(s) in a sequence to a random value将序列中的 1-3 个随机索引更改为随机值
【发布时间】:2016-02-08 01:45:51
【问题描述】:

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

'(1 2 3 4 5)

一个可能的输出。

'(1 3 3 4 5)

另一个

'(1 5 5 4 5)

【问题讨论】:

标签: clojure sequence


【解决方案1】:

在 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]

【讨论】:

  • 感谢您向我展示了一种更合适的解决此问题的方法是clojure。我确实要求像我下面这样的顺序输出解决方案。这是我的主要问题。我想我可以通过在将其输入此函数之前将其转换为向量然后再将其重新转换来解决这个问题。
【解决方案2】:

想通了。决定走更长的路,做一个功能。

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

【讨论】:

  • 在函数中def 是不好的形式。每次调用changeSequence 时,您是否都在尝试重新定义transsequ?在 CamelCase 中命名函数的形式也很糟糕,使用小写和连字符标点符号更惯用(即(defn change-sequence [...]...)
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
相关资源
最近更新 更多