我是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)
答案 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
会产生一些副作用(修改随机数生成器的状态)