`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 预计会有一些副作用(修改随机数生成器的状态)