如何在Clojure中创建一个随机数的惰性序列 [英] How to create a lazy sequence of random numbers in clojure

查看:41
本文介绍了如何在Clojure中创建一个随机数的惰性序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何创建一个懒惰的随机数序列?

How can I create a lazy sequence of random numbers?

我当前的代码:

(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:传递给:user $ random-numbers $ fn的args(1)的数量错误在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]

(Exception in thread "main" clojure.lang.ArityException: Wrong number of args (1) passed to: user$random-numbers$fn at clojure.lang.AFn.throwArity(AFn.java:437) at clojure.lang.AFn.invoke(AFn.java:39) at clojure.core$iterate$fn__3870.invoke(core.clj:2596) at clojure.lang.LazySeq.sval(LazySeq.java:42) at clojure.lang.LazySeq.seq(LazySeq.java:60) at clojure.lang.RT.seq(RT.java:466) at clojure.core$seq.invoke(core.clj:133) at clojure.core$take$fn__3836.invoke(core.clj:2499) at clojure.lang.LazySeq.sval(LazySeq.java:42) at clojure.lang.LazySeq.seq(LazySeq.java:60) at clojure.lang.Cons.next(Cons.java:39) at clojure.lang.RT.next(RT.java:580) at clojure.core$next.invoke(core.clj:64) at clojure.core$nthnext.invoke(core.clj:2752) at 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) at clojure.core$pr.invoke(core.clj:3276) at clojure.lang.AFn.applyToHelper(AFn.java:161) at clojure.lang.RestFn.applyTo(RestFn.java:132) at clojure.core$apply.invoke(core.clj:600) at clojure.core$prn.doInvoke(core.clj:3309) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:600) at clojure.core$println.doInvoke(core.clj:3329) at clojure.lang.RestFn.invoke(RestFn.java:408) at user$eval7.invoke(testing.clj:12) at clojure.lang.Compiler.eval(Compiler.java:6465) at clojure.lang.Compiler.load(Compiler.java:6902) at clojure.lang.Compiler.loadFile(Compiler.java:6863) at clojure.main$load_script.invoke(main.clj:282) at clojure.main$script_opt.invoke(main.clj:342) at 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) [Finished in 3.8s with exit code 1]

这是一种完全错误的方法,因为我正在使用状态,即r是java.util.Random的实例,还是仅仅是nooby语法错误?

Is this a completey wrong approach, because I am using state, namely r is an instance of java.util.Random, or is it just a nooby syntax error?

我只是研究自己的clojure,所以请忍受我:).

I just studing clojure on myself, so please bear with me :) .

推荐答案

重复非常适合重复运行函数并将结果收集在seq中

repeatedly is great for repeatedly running a function and gathering the results in a seq

user> (take 10 (repeatedly #(rand-int 42)))
(14 0 38 14 37 6 37 32 38 22)

对于您的原始方法,

:iterate接受一个参数,将其提供给一个函数,然后接受该结果,然后将其传递回相同的函数.我在这里不是您想要的,因为您使用的函数不需要任何参数.您当然可以为其指定一个占位符并使其生效,尽管重复可能更合适.

as for your original approach: iterate takes an argument, feeds it to a function and then takes the result of that and passes it back to the same function. I't not quite what you want here because the function you are using doesn't need any arguments. You can of course give it a placeholder for that argument and get it working, though repeatedly is likely a better fit.

(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)

这篇关于如何在Clojure中创建一个随机数的惰性序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆