In a game show, a contestant is presented three doors. One door has a car behind it; the other two doors only have goats. The contestant chooses a door, which remains closed. The game host reveals one of the remaining two, and the contestant has the option to switch. On average, should the contestant switch?
; choose a random index of a list
(define (random-list-index l)
(sample-discrete (make-list (length l) (div 1 (length l)))))
; remove a value from a list
(define (filter-out a-list value)
(filter (lambda (x) (if (equal? x value) #f #t)) a-list))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define door-options (list 0 1 2))
(define (pick-door)
(random-list-index door-options))
(define (gen-doors car-door)
(let [(doors (list 'goat 'goat 'goat))]
(update-list doors car-door 'car)))
; reveal a door after the contestant chooses one
(define (show-door first-choice car-door)
(if (= first-choice car-door)
(random-list-index (filter-out door-options car-door))
(first (filter-out (filter-out door-options first-choice) car-door))))
(define samples
(repeat 10000
(lambda ()
(define car-door (pick-door))
(define doors (gen-doors car-door))
(define first-choice (pick-door))
(define shown-door (show-door first-choice car-door))
(define switch-doors #t)
(define second-choice
(if switch-doors
(first (filter-out (filter-out door-options first-choice) shown-door))
first-choice))
(equal? second-choice car-door))))
(hist samples "Chance of winning if you switch")
References: