2010-10-27 35 views
12

Được rồi, câu hỏi cuối cùng và tôi sẽ hoàn thành trò chơi đoán số của mình trong Common Lisp! : D Bất cứ khi nào trò chơi bắt đầu (hoặc trò chơi mới bắt đầu sau trận đấu đầu tiên), chức năng sau được gọi.(Ngẫu nhiên) trong Common Lisp Not So Random?

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

Vì vậy, cho là, mỗi lần các cầu thủ bắt đầu một trò chơi, *target* nên được đặt thành một số nguyên ngẫu nhiên mới giữa 1-100. Tuy nhiên, mỗi lần, *target* mặc định là 82. Làm cách nào để tôi thực hiện hành động (random) ... ngẫu nhiên?

Trả lời

24

Bạn cần tạo trạng thái ngẫu nhiên khi bắt đầu chương trình.

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

Nhận xét không nhất thiết phải chính xác. Đặc điểm kỹ thuật CL không ủy quyền sử dụng thời gian hiện tại, nó chỉ nói "ngẫu nhiên được khởi tạo bởi một số phương tiện". – Svante

+0

@Svante: Đúng vậy. Đã cập nhật. – kennytm