如何创建一个懒惰的随机数序列?
我目前的代码:
(import '(java.util Random))
(def r (new Random))
(defn rnd [_]
(.nextInt r 10))
(defn random-numbers [max]
(iterate #(.nextInt r max) (.nextInt r max)))
(println (take 5 (random-numbers 10)))
执行它会抛出异常:
(线程“main”中的异常clojure.lang.ArityException:在clojure.lang上的clojure.lang.AFn.throwArity(AFn.java:437)传递给:user $ random-numbers $ fn的args(1)错误数量.AFn.invoke(AFn.java:39)位于clojure.lang.LazySeq的clojure.lang.LazySeq.sval(LazySeq.java:42)上的clojure.core $ iterate $ fn__3870.invoke(core.clj:2596) . 位于clojure.core $ seq.invoke(core.clj:133)的clojure.lang.RT.seq(RT.java:466)的seq(LazySeq.java:60)位于clojure.core $ take $ fn__3836.invoke(core .clj:2499)在clojure.lang.LazySeq.val(LazySeq.java:42)的clojure.lang.LazySeq.seq(LazySeq.java:60)的clojure.lang.Cons.next(Cons.java:39)在clojure.core $ next.invoke(core.clj:64)的clojure.core.RT.next(RT.java:580),在clojure.core $ nthnext.invoke(core.clj:2752)的clojure.core $ print_sequential.invoke(core_print.clj:57)at clojure.core $ fn__4990.invoke(core_print.clj:140)at clojure.lang.MultiFn.invoke(MultiFn.java:167)at clojure.core $ pr_on.invoke(core .clj:3264)在clojure.lang $ pr.invoke(core.clj:3276)的clojure.lang.AFn.ap plyToHelper(AFn.java:161)位于clojure.core上的clojure.core.RestFn.applyTo(RestFn.java:132)$ apply.invoke(core.clj:600)位于clojure.core $ prn.doInvoke(core.clj) :3309)在clojure.core(RestFn.java:137)的clojure.core $ apply.invoke(core.clj:600)at clojure.core $ println.doInvoke(core.clj:3329)at clojure用户$ eval7.invoke(testing.clj:12)的.lang.RestFn.invoke(RestFn.java:408)位于clojure.lang.Compiler.eval(Compiler.java:6465)的clojure.lang.Compiler.load( Compiler.java:6902)位于clojure.main $ load_script.invoke(main.clj:282)的clojure.lang.Compiler.loadFile(Compiler.java:6863),位于clojure.main $ script_opt.invoke(main.clj:342) )clojure.main $ main.doInvoke(main.clj:426)at clojure.lang.RestFn.invoke(RestFn.java:408)at clojure.lang.Var.invoke(Var.java:401)at clojure.lang .AFn.applyToHelper(AFn.java:161)at clojure.lang.Var.applyTo(Var.java:518)at clojure.main.main(main.java:37)[在3.8s完成,退出代码为1]
这是一个完全错误的方法,因为我使用的是状态,即r是java.util.Random的一个实例,还是只是一个nooby语法错误?
我只是在研究自己的clojure,所以请忍受我:) .
4 回答
repeatedly
非常适合重复运行函数并在seq中收集结果至于你的原始方法:iterate接受一个参数,将它提供给一个函数,然后获取结果并将其传递回同一个函数 . 我需要任何论据 . 你当然可以为它提供一个占位符并使其工作,尽管
repeatedly
可能更合适 .作为一般指南,不要从Java的类/函数开始 . 首先查看Clojure在clojure中的核心函数和命名空间 . *(然后在贡献的命名空间中,现在使用模块化存储库:参见http://dev.clojure.org/display/doc/Clojure+Contrib); rand-int本身在clojure-core中很容易获得 . 那么,如何开始搜索随机数助手呢?
使用Clojure 1.3以后,您可以“使用”clojure-repl命名空间来访问方便的apropos函数(与Unix / linux中的apropos命令一样使用); apropos返回到目前为止加载的命名空间中所有匹配的defs .
clojure.repl中的find-doc函数也是另一种选择 .
另一个指针是在www.clojuredocs.org上搜索,其中包括clojure core和clojure中funcs的用例 . * .
至少为了测试目的,能够通过播种发生器来重复"random"序列是很好的 . 新的
spec
库以这种方式报告其测试结果 .本机Clojure函数不允许您为随机序列设定种子,因此我们必须使用底层Java函数:
我们可以使用换能器吗?
我们也可以使用
rand-int
:要使用它来生成延迟序列,我们将使用
sequence
这返回一个懒惰的随机数序列 . 要获得完整的n个数字序列,我们可以使用
take
作为: