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
Random 为什么';在Clojure中使用种子时,是否重复生成可复制的随机数?_Random_Clojure - Fatal编程技术网

Random 为什么';在Clojure中使用种子时,是否重复生成可复制的随机数?

Random 为什么';在Clojure中使用种子时,是否重复生成可复制的随机数?,random,clojure,Random,Clojure,我有一些函数需要一系列随机数,所以我使用了一些简单的原语,比如#(inc(g/uniform 0n)),我似乎无法生成一系列可复制的随机数,即使我正在重新绑定*rnd*,除非我按如下所示生成它们。我无法想象这是最好的方法,所以有人能指出如何做得更好吗 注意:如图所示,我将下面的每个示例运行三次,以生成给定的结果 (ns example.show (:require [clojure.data.generators :as g])) (binding [g/*rnd* (java.util

我有一些函数需要一系列随机数,所以我使用了一些简单的原语,比如
#(inc(g/uniform 0n))
,我似乎无法生成一系列可复制的随机数,即使我正在重新绑定
*rnd*
,除非我按如下所示生成它们。我无法想象这是最好的方法,所以有人能指出如何做得更好吗

注意:如图所示,我将下面的每个示例运行三次,以生成给定的结果

(ns example.show
  (:require [clojure.data.generators :as g]))


(binding [g/*rnd* (java.util.Random. 42)]
  (take 10 (repeatedly #(inc (g/uniform 0 n))))

=> (9 4 5 4 4 5 1 8 2 9)

=> (2 1 1 6 3 10 10 4 1 9)

=> (10 4 7 8 9 6 10 1 8 3)


(binding [g/*rnd* (java.util.Random. 42)]
  (g/reps 10 #(inc (g/uniform 0 n)))

=> (3 9 4 6 3 8 6 6 5 4)

=> (7 8 4 7 7 5 7 4 8 7)

=> (2 8 7 8 8 8 9 2 6 5)

;; This seems to work
(binding [g/*rnd* (java.util.Random. 42)]
  (letfn [(roll [n] #(inc (g/uniform 0 n)))]
    [((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10)) ((roll 10))]))

=> [8 7 4 3 7 10 4 3 5 8]

=> [8 7 4 3 7 10 4 3 5 8]

=> [8 7 4 3 7 10 4 3 5 8]

因为懒惰。在序列实现之前,从
绑定返回。因此,惰性序列永远看不到您设置的绑定。一种解决方案是在绑定内部的序列上强制实现
doall

如果您对另一个答案的评论表明,您希望保留惰性,那么您需要在反复传递给
的函数中应用绑定,捕获在惰性seq之外创建的种子。例如:

(defn rand-seq [seed]
  (let [r (java.util.Random. seed)]
    (repeatedly #(binding [g/*rnd* r]
                   (inc (g/uniform 0 10))))))

(take 10 (rand-seq 42))
#=> (8 7 4 3 7 10 4 3 5 8)

(take 10 (rand-seq 42))
#=> (8 7 4 3 7 10 4 3 5 8)

我认为延迟计算只是延迟执行,可能是通过将参数包装在闭包中,这是否会影响任何其他特定于订单的消费函数?如果没有
doall
,我该如何处理它,因为我的计算可能会很昂贵,而且我不想丢掉懒惰。有关解释和解决方法,请参阅。