【发布时间】:2014-03-16 19:37:26
【问题描述】:
我有一些函数需要一系列随机数,所以我采用了一些简单的原语,例如 #(inc (g/uniform 0 n)),但我似乎无法生成可重现的随机数系列,即使我正在重新绑定 @987654322 @,除非我如下所示生成它们。我无法想象这是最好的方法,所以有人能指出如何做得更好吗?
注意:如下所示,我将每个示例运行 3 次以产生给定的结果。
(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]
【问题讨论】: