用于生成随机长数的clojure方式

时间:2016-02-07 04:27:30

标签: clojure

使用Clojure,如何生成随机长数?我知道Clojure有rand-int函数但它只适用于整数。如果给定的数字很长,我得到了这个repl错误:

  

IllegalArgumentException Value out of range for int: 528029243649 clojure.lang.RT.intCast (RT.java:1205)

2 个答案:

答案 0 :(得分:8)

如果你看一下rand-int的来源

(defn rand-int
  "Returns a random integer between 0 (inclusive) and n (exclusive)."
  [n] (int (rand n)))

你可以做类似的事情

(long (rand n)))

答案 1 :(得分:7)

Clojure的randrand-int使用java.util.Random作为基础随机数生成器。如果您的应用程序严重依赖于随机数,您可能需要考虑使用Java编写的higher-quality random number generator,例如MersenneTwisterFast。这有一个nextLong()方法,它很容易在Clojure中使用。 Java的标准类SecureRandom也可能值得考虑;它的设计目的不同于Mersenne Twister。还有其他优秀的Java随机数生成器。取决于您使用的随机数。对于偶尔使用随机数,java.util.Random可能就好了。其他人在评论中提到了其他选项。

我将描述MersenneTwisterFast的使用。使用我提到的其他类基本上是相同的,但没有初始步骤。

使用Leiningen,将这样的内容添加到project.clj:

  :java-source-paths ["src/java"]

然后将MersenneTwisterFast.java的Java源代码放在src / java / ec / util中。然后你可以这样做:

(ns my.namespace
  (:import [ec.util MersenneTwisterFast]))

(def rng (MersenneTwisterFast. 42)) ; Specify a different seed, e.g. from system time.
(defn next-long [] (.nextLong rng))