(Случайно) в Common Lisp Не так ли случайно?
Хорошо, последний вопрос, и я закончу свою игру по угадыванию чисел в 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)
действовать... случайно?
3 ответа
Вам нужно заполнить случайное состояние в начале программы.
(setf *random-state* (make-random-state t))
;; # this initializes the global random state by
;; "some means" (e.g. current time.)
Я думаю, что если вы определяете функцию со случайным числом в ней, она не вызывается при вызове функции, на самом деле она будет определяться при загрузке в файл и при запуске этого определения она фиксируется на этом значении. Затем вы вызываете функцию каждый раз, номер всегда будет одинаковым. Когда я передавал переменную в функцию со случайным значением каждый раз, когда она вызывалась, тогда она была случайной каждый раз. По крайней мере, это то, что я испытал в своей программе
В Gimp Scheme (производная от Lisp) я обнаружил, что мне нужно использовать следующее:(set! *seed* (car (gettimeofday)))
Это начальное число случайных чисел из часов ( начальное значение является глобальным)
Вам также может понадобиться:(random-next)
Это генерирует следующее случайное число с использованием семени
Не совсем случайный метод заключается в установке начального числа:(srand 12345)
; используется в случаях, когда результат должен быть воспроизводимым — полезно в контекстах графического дизайна.