`iterate` 和 `repeatedly` 的区别
difference between `iterate` and `repeatedly`
我是 clojure/clojurescript 的新手,我想弄清楚为什么这个函数总是 returns 100 作为第一个随机整数,最后是几个零:
(take 10 (iterate rand-int 100))
;; (100 30 19 15 4 3 2 0 0 0)
但这按预期工作:
(take 10 (repeatedly #(rand-int 100)))
;; (14 14 16 92 10 69 85 74 65 95)
但是如果我将匿名 fn 与 iterate
一起使用,我会得到 nil
作为第一个值,但其余值看起来还可以:
(take 10 (iterate #(rand-int 100)))
;; (nil 27 19 76 70 40 63 72 32 55)
iterate
returns 序列 (x (f x) (f (f x)) ...)
因此第一个元素是您提供的 100
。第二个元素是 (rand-int 100)
的结果,其中 returns 是 (0, 99]
范围内的随机数。在本例中,它返回 30
,因此第三个元素是 (rand-int 30)
的结果,其中 returns 是范围 (0, 29]
中的一个元素。由于范围正在缩小,生成的数字迅速接近 0。
相比之下 repeatedly
returns 序列 ((f) (f) (f)...)
其中 f
是一个没有参数的函数,例如 #(rand-int 100)
生成数字的范围总是(0, 99]
。 f
预计会有一些副作用(修改随机数生成器的状态)
我是 clojure/clojurescript 的新手,我想弄清楚为什么这个函数总是 returns 100 作为第一个随机整数,最后是几个零:
(take 10 (iterate rand-int 100))
;; (100 30 19 15 4 3 2 0 0 0)
但这按预期工作:
(take 10 (repeatedly #(rand-int 100)))
;; (14 14 16 92 10 69 85 74 65 95)
但是如果我将匿名 fn 与 iterate
一起使用,我会得到 nil
作为第一个值,但其余值看起来还可以:
(take 10 (iterate #(rand-int 100)))
;; (nil 27 19 76 70 40 63 72 32 55)
iterate
returns 序列 (x (f x) (f (f x)) ...)
因此第一个元素是您提供的 100
。第二个元素是 (rand-int 100)
的结果,其中 returns 是 (0, 99]
范围内的随机数。在本例中,它返回 30
,因此第三个元素是 (rand-int 30)
的结果,其中 returns 是范围 (0, 29]
中的一个元素。由于范围正在缩小,生成的数字迅速接近 0。
相比之下 repeatedly
returns 序列 ((f) (f) (f)...)
其中 f
是一个没有参数的函数,例如 #(rand-int 100)
生成数字的范围总是(0, 99]
。 f
预计会有一些副作用(修改随机数生成器的状态)