我有一个乐透的代码。它工作正常,但我希望随机生成数字而不是作为参数传递给函数。
我在考虑包含(cons(+1(随机50))列表)可能有效,但我不确定如何正确实现这一点!
(defun play-lotto (&aux list)
(dotimes (i 6)
(loop
(princ "Write a Integer between 0 and 50: ")
(let ((number (read)))
(if (and (integerp number) (< 0 number 50))
(if (member number list)
(progn
(princ "You can only choose a number once")
(terpri))
(progn
(push number list)
(return)))
(progn
(princ "Not a Integer between 0 and 50")
(terpri))))))
(if (equal (sort list #'<)
(sort lottery #'<))
(princ "You won!")
(princ "You lost...")))
答案 0 :(得分:0)
您应该实现新功能draw-lottery
并将结果传递给play-lotto
。
我作为部分Fisher-Yates洗牌来做。
(defun iota-vector (end &key (start 0) &aux (length (- end start)))
"Creates a vector with all numbers from START \(inclusive) to END
\(exclusive). END must be greater than or equal to START."
(assert (not (minusp length)))
(let ((i start))
(map-into (make-array length)
(lambda () (prog1 i (incf i))))))
(defun draw-lottery ()
"Draws six random numbers from 1 to 49 \(inclusive) without replacement and
returns them as a sorted list."
(let ((urn (iota-vector 50 :start 1)))
(dotimes (i 6)
(rotatef (aref urn i)
(aref urn (+ i (random (- 49 i))))))
(coerce (sort (subseq urn 0 6) #'<) 'list)))