2010-10-27 8 views
12

ठीक है, अंतिम प्रश्न और मैं आम लिस्प में अपना नंबर अनुमान लगाने वाला गेम समाप्त कर दूंगा! : डी जब भी खेल शुरू होता है (या पहले गेम के बाद एक नया गेम शुरू होता है), तो निम्न फ़ंक्शन को कॉल किया जाता है।(यादृच्छिक) सामान्य लिस्प में इतना यादृच्छिक नहीं है?

;;; 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) कार्य कैसे कर सकता हूं ... यादृच्छिक रूप से?

उत्तर

24

आपको कार्यक्रम की शुरुआत में यादृच्छिक स्थिति को बीज करने की आवश्यकता है।

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

टिप्पणी आवश्यक नहीं है। सीएल विनिर्देश वर्तमान समय का उपयोग करने के लिए जरूरी नहीं है, यह सिर्फ "कुछ तरीकों से यादृच्छिक रूप से प्रारंभ" कहता है। – Svante

+0

@Svante: हाँ आप सही हैं। अपडेट किया गया। – kennytm

संबंधित मुद्दे