3

这是我的第一个普通 lisp 作业的一部分。

我们必须定义一个变量来表示从 0 到 100 的任意 10 个随机整数:我不确定这里要问什么。我应该写:(setf var1 '())

然后,我们必须定义一个函数,该函数生成一个包含 10 个随机整数的列表并返回一个包含这些数字的列表。

这是我写的,但我一直得到 NIL 作为我的输出。你知道代码有什么问题吗:

(setf *random-state* (make-random-state t))
(setf var1 '())


(defun randlist (var1)
(dotimes (i 10)
    (setf temp (random 101))
        (cons 'temp var1  ) ) )
4

5 回答 5

8

编写一个函数,返回一个包含 10 个随机整数的新列表:

(defun randlist ()
  (let ((lst ()))
    (dotimes (i 10)
       (setf lst (cons (random 101) lst)))
   lst))

然后您可以将其结果分配给一个变量:

(defvar var1 (randlist))

演示

于 2012-09-30T23:57:52.487 回答
7

你不需要*random-state*像那样初始化。无论如何,这是默认设置。如果您有不同的随机数生成器实现,则需要对其进行初始化。

虽然(setf whatever nil)可能会起作用,但这不是您声明变量的方式。setf是一个为符号赋值的宏。通常,您首先创建符号,然后分配给它们。如果您需要动态变量,您的选项是defparamterdefvar宏,例如:

(defparameter var1 nil)
(defvar var2 nil)

您的函数randlist返回nil,因为这是dotimes宏返回的内容,这是函数中执行的最后一个形式。您可以将其更改为 return var1,但是使用动态变量,尤其是这种方式,并不是一个好的编码习惯。从任务中听起来好像你被要求简单地编写一个返回十个整数列表的函数,不需要也将它分配给函数外部的动态变量。

(defun randlist ()
  (loop for i from 0 below 10 collect (random 101)))

可能是最简单的方法。但是真的有很多很多其他的方法:)

只是为了好玩,这里有一个替代方案,虽然不是特别好。我希望它更短,但事实并非如此:)

(defun random-list ()
  (mapcar #'random (make-list 10 :initial-element 101)))
于 2012-10-01T00:02:24.750 回答
1

让我们用递归来做到这一点:

(defun rnd-list()
  (rnd-list-1 10 10))

(defun rnd-list-1 (limit count)
  (cond ((<= count 0)
         nil)
        (t
         (cons (random limit)
               (rnd-list-1 limit (1- count))))))
于 2013-09-16T15:46:00.707 回答
0

或者你可以这样做——

(defun rnd-list()
  (let (lst)
    (dotimes (n 100)
      (push (random 101) lst))
    (reverse lst)))
于 2013-03-12T23:45:22.340 回答
0

授权do,迭代n并定义lst为空列表;当n到达10return lst。在每次迭代push中,一个随机数到lst

(do ((n 1 (incf n))
     (lst ()))
    ((> n 10) lst)
  (push (random 101) lst))

=> (31 35 59 19 84 54 62 44 69 54)
于 2019-11-22T23:05:08.567 回答