这是我在普通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 ) ) )
答案 0 :(得分:7)
编写一个返回一个包含10个随机整数的新列表的函数:
(defun randlist ()
(let ((lst ()))
(dotimes (i 10)
(setf lst (cons (random 101) lst)))
lst))
然后您可以将其结果分配给变量:
(defvar var1 (randlist))
<强> DEMO 强>
答案 1 :(得分:6)
您无需像这样初始化*random-state*
。无论如何,那是默认的。如果你有一个不同的随机数生成器实现,你需要初始化它。
虽然(setf whatever nil)
可能会起作用,但这不是您声明变量的方式。 setf
是用于为符号分配值的宏。通常,您首先创建符号然后分配给它们。如果您需要动态变量,则您的选项为defparamter
或defvar
个宏,例如:
(defparameter var1 nil)
(defvar var2 nil)
您的函数randlist
返回nil
,因为这是dotimes
宏返回的内容,这是函数中执行的最后一个表单。您可以将其更改为返回var1
,但使用动态变量,尤其是以这种方式使用并不是一个好的编码实践。从任务中听起来好像你被要求简单地编写一个返回十个整数列表的函数,不需要将它分配给函数外的动态变量。
(defun randlist ()
(loop for i from 0 below 10 collect (random 101)))
也许是最简单的方法。但是还有很多其他方法:)
只是为了好玩,这里有另一种选择,但并不是特别好。我希望它更短,但事实并非如此:)
(defun random-list ()
(mapcar #'random (make-list 10 :initial-element 101)))
答案 2 :(得分: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))))))
答案 3 :(得分:0)
或者你可以这样做 -
(defun rnd-list()
(let (lst)
(dotimes (n 100)
(push (random 101) lst))
(reverse lst)))
答案 4 :(得分:0)
赋予do,遍历n
并将lst
定义为无效列表;当n
到达10
时,返回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)