`iterate`和`repeated`之间的区别

时间:2017-05-23 16:24:42

标签: clojure clojurescript

我是clojure / clojurescript的新手,并试图弄清楚为什么这个函数总是返回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)

但是如果我使用iterate匿名fn,我将nil作为第一个值,但其余的看起来没问题:

(take 10 (iterate #(rand-int 100)))
;; (nil 27 19 76 70 40 63 72 32 55)

1 个答案:

答案 0 :(得分:13)

iterate返回序列(x (f x) (f (f x)) ...),因此第一个元素是您提供的100。第二个元素是(rand-int 100)的结果,它返回范围(0, 99]中的随机数。在这种情况下,它返回30,因此第三个元素是(rand-int 30)的结果,它返回范围(0, 29]中的元素。由于范围正在减小,所生成的数字迅速接近0。

相反,repeatedly返回序列((f) (f) (f)...),其中f是无#(rand-int 100)之类参数的函数,其中生成的数字范围始终为(0, 99]。预计f会产生一些副作用(修改随机数生成器的状态)