为何Clojure代码(take 100 (iterate rand-int 300))输出大量0且首元素为300?
问题分析:为什么
(take 100 (iterate rand-int 300))结果不符合预期? 你写出的代码是:
(take 100 (iterate rand-int 300))
执行后结果总是以300开头,且很快会出现大量连续的0,比如示例输出:
(300 93 59 58 25 14 9 4 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
核心认知误区
你误解了iterate函数的运行逻辑:
iterate f x生成的序列规则是:第一个元素是初始值x,第二个元素是f作用于x的结果,第三个元素是f作用于第二个元素的结果,以此类推——每一步都用前一次的输出作为下一次调用函数的输入。- 对应到你的代码,执行流程是:
- 序列第一个元素是初始值300;
- 第二个元素是
(rand-int 300),生成0~299的随机整数; - 第三个元素是
(rand-int 第二个元素的值),比如第二个元素是93,就生成0~92的随机数; - 当某次生成0后,
(rand-int 0)会固定返回0,后续所有元素都会是0,所以出现大量连续0。
正确实现方式
如果要生成100个0~300(不含300)的独立随机整数,应该用repeatedly——它会重复调用指定函数,每次调用都不依赖前一次的结果:
(take 100 (repeatedly #(rand-int 300)))
也可以用map配合range实现:
(map (fn [_] (rand-int 300)) (range 100))
内容的提问来源于stack exchange,提问作者THX1137
相关产品推荐
相关产品推荐

