Elisp中使用random函数迭代生成随机数直到为1的赋值问题
问题原因和修复方案
你的核心逻辑(setq n (random n))本身是有效的,出现固定值的问题主要来自两个小错误:
counter变量没有声明为局部作用域,直接用setq创建的是全局变量,多次调用会导致计数错乱,甚至和其他全局变量冲突- 如果每次运行得到完全相同的随机序列,是因为Emacs的随机种子默认固定,没有用动态值初始化
修改后的完整代码
(defun rnd (n) ;; 把counter和ret都声明为局部变量,避免污染全局作用域 (let ((ret ()) (counter 0)) (while (< 1 n) (setq n (random n)) (setq counter (1+ counter)) (push n ret)) ;; 直接返回结果列表和步数,不需要依赖全局变量传值 (list (reverse ret) counter))) ;; 调用前先执行一次用当前时间初始化随机种子,保证每次运行序列不同 (random t) (let ((run-result (rnd 100000))) (format "list: %s \n steps: %s" (car run-result) (cadr run-result)))
验证说明
运行后会输出随机序列和总步数,多次执行会得到不同的结果,完全符合你要的反复传入随机值直到得到1的逻辑。
内容的提问来源于stack exchange,提问作者zeynel
相关产品推荐
相关产品推荐

