You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Lisp loop宏收集随机偶数时重复同一值的问题排查

Loop宏生成随机偶数列表的问题排查与修复

你的问题核心在于loop宏中with子句的求值时机:with item = (random 1000)会在循环启动前仅执行一次,之后所有迭代都会复用这个初始生成的随机数,自然会得到一堆相同的值。

修复方案

最简洁的解决方式是把with替换为for,for子句会在每次循环迭代时重新求值右边的表达式,这样每次都能生成新的随机数:

(defun some-test (range)
  (loop repeat range
        for item = (random 1000)
        if (evenp item)
        collect item))

如果需要更显式的赋值控制,也可以用do子句在每次迭代时重新生成随机数:

(defun some-test (range)
  (loop repeat range
        with item
        do (setf item (random 1000))
        if (evenp item)
        collect item))

额外扩展:收集指定数量的偶数

如果你的实际需求是生成恰好range个偶数(而非循环range次后收集符合条件的,可能数量不足),可以调整loop逻辑:

(defun some-test (target-count)
  (loop with result = '()
        until (= (length result) target-count)
        for item = (random 1000)
        when (evenp item)
        do (push item result)
        finally (return (nreverse result))))

这段代码会持续生成随机数,直到收集到足够数量的偶数后返回。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:33:13