如何生成相同系列的伪随机整数?

时间:2014-09-27 10:27:45

标签: random clojure

是否有更多或更少的标准解决方案在Clojure中生成相同系列的伪随机整数?

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

只是想为仍在寻找的任何人添加一个东西,自2015年以来,clojars上就有这样做的库:https://github.com/trystan/random-seed