如何创建随机数的惰性序列?
我当前的代码:
(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:错误数量的参数 (1) 传递给:user$random-numbers$fn
在 clojure.lang.AFn.throwArity(AFn.java:437)
在 clojure.lang.AFn.invoke(AFn.java:39)
在 clojure.core$iterate$fn__3870.invoke(core.clj:2596)
在 clojure.lang.LazySeq.sval(LazySeq.java:42)
在 clojure.lang.LazySeq.seq(LazySeq.java:60)
在 clojure.lang.RT.seq(RT.java:466)
在 clojure.core$seq.invoke(core.clj:133)
在 clojure.core$take$fn__3836.invoke(core.clj:2499)
在 clojure.lang.LazySeq.sval(LazySeq.java:42)
在 clojure.lang.LazySeq.seq(LazySeq.java:60)
在 clojure.lang.Cons.next(Cons.java:39)
在 clojure.lang.RT.next(RT.java:580)
在 clojure.core$next.invoke(core.clj:64)
在 clojure.core$nthnext.invoke(core.clj:2752)
在 clojure.core$print_sequential.invoke(core_print.clj:57)
在 clojure.core$fn__4990.invoke(core_print.clj:140)
在 clojure.lang.MultiFn.invoke(MultiFn.java:167)
在 clojure.core$pr_on.invoke(core.clj:3264)
在 clojure.core$pr.invoke(core.clj:3276)
在 clojure.lang.AFn.applyToHelper(AFn.java:161)
在 clojure.lang.RestFn.applyTo(RestFn.java:132)
在 clojure.core$apply.invoke(core.clj:600)
在 clojure.core$prn.doInvoke(core.clj:3309)
在 clojure.lang.RestFn.applyTo(RestFn.java:137)
在 clojure.core$apply.invoke(core.clj:600)
在 clojure.core$println.doInvoke(core.clj:3329)
在 clojure.lang.RestFn.invoke(RestFn.java:408)
在 user$eval7.invoke(testing.clj:12)
在 clojure.lang.Compiler.eval(Compiler.java:6465)
在 clojure.lang.Compiler.load(Compiler.java:6902)
在 clojure.lang.Compiler.loadFile(Compiler.java:6863)
在 clojure.main$load_script.invoke(main.clj:282)
在 clojure.main$script_opt.invoke(main.clj:342)
在 clojure.main$main.doInvoke(main.clj:426)
在 clojure.lang.RestFn.invoke(RestFn.java:408)
在 clojure.lang.Var.invoke(Var.java:401)
在 clojure.lang.AFn.applyToHelper(AFn.java:161)
在 clojure.lang.Var.applyTo(Var.java:518)
在 clojure.main.main(main.java:37)
[在 3.8 秒内完成,退出代码为 1]
这是一个完全错误的方法,因为我正在使用状态,即 r 是 java.util.Random 的实例,或者它只是一个无人语法错误?
我只是自己学习 clojure,所以请耐心等待:)。
repeatedly
非常适合重复运行函数并将结果收集到 seq 中
user> (take 10 (repeatedly #(rand-int 42)))
(14 0 38 14 37 6 37 32 38 22)
至于您原来的方法: iterate 接受一个参数,将其提供给一个函数,然后获取该结果并将其传递回同一函数。我不完全是你想要的,因为你使用的函数不需要任何参数。当然,您可以为该参数指定一个占位符并使其正常工作repeatedly
可能更适合。
(defn random-numbers [max]
(iterate (fn [ignored-arg] (.nextInt r max)) (.nextInt r max)))
#'user/random-numbers
user> (println (take 5 (random-numbers 10)))
(3 0 0 2 0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)