Pregunta

Bueno, la pregunta final y voy a terminar mi número de juego de adivinanzas en Common Lisp! :. D Cada vez que se inicia el juego (o un nuevo juego comienza después del primer juego), la siguiente función se llama

;;; 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)))

Así que, supuestamente, cada vez que el jugador comienza un juego, *target* debe establecerse en un nuevo número entero aleatorio entre 1-100. Sin embargo, cada vez, *target* por defecto es 82. ¿Cómo puedo hacer (random) acto al azar ...?

¿Fue útil?

Solución

Es necesario sembrar el estado aleatorio al comienzo del programa.

(setf *random-state* (make-random-state t))
;; # this initializes the global random state by
;;   "some means" (e.g. current time.)

Otros consejos

Creo que si se define una función con un número aleatorio en ella, no se llama cuando se llama a la función, en realidad, se determinará cuando se carga en el archivo y cuando esté ejecutando esta definición se fija a ese valor. A continuación, a la que llama a la función cada vez, el número será siempre el mismo. Cuando pasé en una variable a la función con un aleatoria cada vez que se llama, entonces era aleatorio cada vez. Por lo menos, que lo que he experimentado en mi programa

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top