(Случайно) в Common Lisp Не так ли случайно? - PullRequest
13 голосов
/ 27 октября 2010

Хорошо, последний вопрос, и я закончу свою игру с угадыванием чисел в 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) действовать ... случайно?

Ответы [ 2 ]

25 голосов
/ 27 октября 2010

Вам нужно заполнить случайное состояние в начале программы.

(setf *random-state* (make-random-state t))
;; # this initializes the global random state by
;;   "some means" (e.g. current time.)
0 голосов
/ 16 апреля 2018

Я думаю, что если вы определяете функцию со случайным числом в ней, она не вызывается при вызове функции, на самом деле она будет определяться при загрузке в файл и при запуске этого определения, она фиксируется наэто значение.Затем вы вызываете функцию каждый раз, номер всегда будет одинаковым.Когда я передавал переменную в функцию со случайным значением каждый раз, когда она вызывалась, тогда она была случайной каждый раз.По крайней мере, то, что я испытал в своей программе

...