Domanda

Ok, ultima domanda e io ho finito il mio numero di guessing game in Common Lisp! :. D Ogni volta che il gioco inizia (o un nuovo gioco inizia dopo la prima partita), la seguente funzione si chiama

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

Quindi presumibilmente, ogni volta che il giocatore inizia un gioco, *target* deve essere impostato su un nuovo intero casuale compreso tra 1-100. Tuttavia, ogni volta, di default *target* a 82. Come posso fare (random) atto ... in modo casuale?

È stato utile?

Soluzione

È necessario seminare lo stato casuale all'inizio del programma.

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

Altri suggerimenti

Credo che se si definisce una funzione con un numero casuale in esso, non viene chiamato quando si chiama la funzione, in realtà, esso sarà determinato quando si carica nel file e quando viene eseguito questa definizione è fissato a tale valore. Poi si sta chiamando la funzione di volta in volta, il numero sarà sempre lo stesso. Quando passai in una variabile per la funzione con un casuale ogni volta che è stato chiamato, poi era casuale ogni volta. Almeno, questo quello che ho vissuto nel mio programma

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top