15

好的,最后一个问题,我将在 Common Lisp 中完成我的猜数字游戏!:D 每当游戏开始时(或在第一场比赛之后开始新的比赛),都会调用以下函数。

;;; Play the game
(defun play ()
    ;; If it's their first time playing this session,
    ;; make sure to greet the user.
    (unless (> *number-of-guesses* 0)
        (welcome-user))
    ;; Reset their remaining guesses
    (setq *number-of-guesses* 0)
    ;; Set the target value
    (setq *target*
        ;; Random can return float values,
        ;; so we must round the result to get
        ;; an integer value.
        (round
            ;; Add one to the result, because
            ;; (random 100) yields a number between
            ;; 0 and 99, whereas we want a number
            ;; from 1 to 100 inclusive.
            (+ (random 100) 1)))
    (if (eql (prompt-for-guess) t)
        (play)
        (quit)))

所以按理说,玩家每次开始游戏时,*target*都应该设置一个新的1-100之间的随机整数。但是,每次都*target*默认为 82。如何使(random)行为...随机?

4

2 回答 2

30

您需要在程序开始时播种随机状态。

(setf *random-state* (make-random-state t))
;; # this initializes the global random state by
;;   "some means" (e.g. current time.)
于 2010-10-27T14:04:12.780 回答
0

我认为,如果您定义一个带有随机数的函数,则在调用该函数时不会调用它,实际上,它将在您加载文件时确定,并且当它运行此定义时,它会固定为该值。然后你每次都调用这个函数,数字总是一样的。当我每次调用一个随机变量时,它每次都是随机的。至少,我在我的程序中所经历的

于 2018-04-16T02:51:03.687 回答