Since, I am not some 'uber-lisp-hacker' this is not the most efficient code one can write and if some uber lisp hacker finds this , maybe he can improve it.
Anyway here is the code..
;; Monty Hall.LISP
;; Simulation for the Monty Hall problem as in Wikipedia..
(let ((host 0) (stick-wins 0) (switch-wins 0) (total-trials 3000))
  (dotimes (i total-trials)
    ; chose random postions for car and goat, choices for contestant
    (let* ((car (random 3))
      (goat1 (cond ((= car 0) 1) ((= car 1) 2) ((= car 2) 0)))
      (goat2 (cond ((= goat1 0) 1) ((= goat1 1) 2) ((= goat1 2) 0)))
      (sticker (random 3))
      (switcher sticker))
    ; select the door that the host opens and
    ; the door the switcher switches too..
    (setf host (cond ((= sticker goat1) goat2) (t goat1)))
    (setf switcher (cond ((= host goat2) car)
          (t (cond ((= switcher car) goat2)
             ((= switcher goat2) car)))))
    (if (= sticker car) (incf stick-wins))
    (if (= switcher car) (incf switch-wins))
    (format t "Car:~D, Goat 1:~D, Goat 2:~D, Sticker:~D, Switcher:~D~%"
      car goat1 goat2 sticker switcher)))
   (format t "Total Trials : ~D, Sticker Wins ~D times(~D %),
     Switcher Wins ~D times (~D %)~%"
   total-trials
   stick-wins
   (* (/ stick-wins total-trials) 100.00)
   switch-wins
   (* (/ switch-wins total-trials) 100.00)))
Signing Off,
Vishnu Vyas
1 comment:
I was not allowed to use the PRE-tag in html, so indentation is screwed.
;;;
;;; The Monty Hall Problem (a bit reduced)
;;;
(defun percentage (part total)
(float (* (/ part total) 100)))
(defun measure-winning-rate (times)
(let ((win-first 0)
(win-second 0))
(loop repeat times do
;; If the first choice is a car, first choice wins.
;; If not, the second choice would have won this round,
;; because it MUST be the car then.
(if (eql (nth (random 3) '(:goat :goat :car)) :car)
(incf win-first)
(incf win-second)))
(list (list 'first-choice :absolute win-first :percentage (percentage win-first times))
(list 'second-choice :absolute win-second :percentage (percentage win-second times)))))
Post a Comment