(Random) in Common Lisp Not So Random?

Viewed 9421

Okay, final question and I'll have finished my number guessing game in Common Lisp! :D Whenever the game starts (or a new game begins after the first game), the following function is called.

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

So supposedly, each time the player starts a game, *target* should be set to a new random integer between 1-100. However, each time, *target* defaults to 82. How do I make (random) act... randomly?

3 Answers

In Gimp Scheme (Lisp derivative) I found that I needed to use the following: (set! *seed* (car (gettimeofday))) This is the Random Number Seed From Clock (seed is global)

You may also need: (random-next) This generates the next Random Number Using Seed

The non-truly random method is to set the seed: (srand 12345) ; used in cases where the result is to be repeatable - useful in graphic design contexts.

Related