2014-09-27 57 views
1

Clojure中是否存在或多或少的标准解决方案来生成相同的伪随机整数序列?如何生成相同的一系列伪随机整数?

我知道三个随机化标准函数:rand,rand-intrand-nth,但他们似乎没有提供任何方式来'设置'他们的内部状态。

+0

可能重复的[如何生成具有重复兰特随机序列-int](http://stackoverflow.com/questions/24007063/how-to-generated-repeatable-random-sequences-with-rand-int) – jonrsharpe 2014-09-27 10:40:06

+0

[为什么在使用时为什么不重复生成可重复的随机数在Clojure的种子?](http://stackoverflow.com/questions/22441860/why-doesnt-repeatedly-generate-reproducible-random-numbers-when-using-a-seed-in) – jbr 2014-09-27 10:42:30

+0

@jonrsharpe,的确如此是重复的,但引用的问题无论如何都没有正确的答案。 – Mark 2014-09-27 10:42:35

回答

4
(defn randomish [seed] 
    (repeatedly 
    (let [gen (java.util.Random. seed)] 
     (fn [] (.nextInt gen))))) 

(take 5 (randomish 10)) 
;(-1157793070 1913984760 1107254586 1773446580 254270492) 

(take 5 (randomish 10)) 
;(-1157793070 1913984760 1107254586 1773446580 254270492) 

randomishrepeatedly

  • 捕获捕获Random对象
  • 保持由seed初始化易变内部状态
  • 功能

randomish的每次调用都会产生一个包含唯一对象Random的新序列对象。但是Random具有相同种子的物体产生相同的序列。

(如果上面有误,纠正我,possible duplicate似乎变得沉重)。

它可能会更好,Clojure中,调用.nextLong而不是nextInt


通过请求,适于处理可选的(不包括)限制:

(defn randomish 
    ([seed] 
    (repeatedly 
     (let [gen (java.util.Random. seed)] 
     (fn [] (.nextInt gen))))) 
    ([seed limit] 
    (repeatedly 
     (let [gen (java.util.Random. seed)] 
     (fn [] (.nextInt gen limit)))))) 

...产生的

(take 5 (randomish 10 100)) 
;(13 80 93 90 46) 

(take 5 (randomish 10 100)) 
;(13 80 93 90 46) 
+0

很好的答案,谢谢! – Mark 2014-09-27 12:00:36