http://en.wikipedia.org/wiki/Monty_Hall_problem
Code: Select all
;monty_hall_problem.pb
;9/3/08 by chris319
;THIS PROGRAM IS A MONTE CARLO SIMULATION OF THE "MONTY HALL PROBLEM",
;NAMED AFTER THE CANADIAN EMCEE OF THE AMERICAN GAME SHOW "LET'S MAKE A DEAL"
;THERE ARE THREE DOORS ON STAGE. TWO OF THE DOORS CONCEAL A BOOBY PRIZE KNOWN AS
;A "ZONK". ONE OF THE DOORS CONCEALS A LOVELY PRIZE.
;THE CONTESTANT PICKS ONE OF THE THREE DOORS. THE PRIZE BEHIND THOSE DOORS IS NOT REVEALED.
;MONTY THEN REVEALS WHICHEVER OF THE TWO REMAINING DOORS CONCEALS A "ZONK". IF BOTH REMAINING
;DOORS CONCEAL A "ZONK", ONE OF THEM IS ARBITRARILY CHOSEN AND THE "ZONK" BEHIND IT IS REVEALED.
;HAVING REVEALED THE CONTENTS OF ONE OF THE DOORS WHICH CONTAINS A "ZONK", MONTY NOW OFFERS THE
;CONTESTANT THE OPTION OF EITHER KEEPING THE DOOR HE ORIGINALLY SELECTED OR SWITCHING TO THE OTHER
;UNOPENED DOOR. THE CONTESTANT CHOOSES, THE SELECTED DOOR IS OPENED AND THE CONTESTANT IS AWARDED
;THE PRIZE IT CONCEALED.
;THIS PROGRAM SIMULATES GAME PLAY AND TALLIES THE NUMBER OF WINS BASED ON KEEPING THE ORIGINAL DOOR AND
;SWITCHING TO THE UNOPENED DOOR.
OpenConsole()
Dim config$(3,3) ;THREE CONFIGURATIONS, THREE DOORS
config$(1,1) = "PRIZE" ;DOOR 1
config$(1,2) = "ZONK" ;DOOR 2
config$(1,3) = "ZONK" ;DOOR 3
config$(2,1) = "ZONK" ;DOOR 1
config$(2,2) = "PRIZE" ;DOOR 2
config$(2,3) = "ZONK" ;DOOR 3
config$(3,1) = "ZONK" ;DOOR 1
config$(3,2) = "ZONK" ;DOOR 2
config$(3,3) = "PRIZE" ;DOOR 3
;POSSIBLE OUTCOMES FOR SCORING:
prize_no_switch.f = 0: zonk_no_switch.f = 0
prize_switch.f = 0: zonk_switch.f = 0
;ONE MILLION RUNS
For ct = 1 To 1000000
;CHOOSE A CONFIGURATION AT RANDOM
config = Random(2) + 1
;SIMULATE EFFECT OF NOT SWITCHING
pick = Random(2) + 1 ;CONTESTANT PICK
;THE FOLLOWING Repeat ... Until STATEMENT MAY BE ELIMINATED WITHOUT AFFECTING THE RESULTS.
;THE CONTESTANT KEEPS THE ORIGINAL DOOR REGARDLESS OF WHICH DOOR MONTY REVEALED.
Repeat ;PICK A DOOR WHICH HAS NOT BEEN SELECTED BY THE CONTESTANT AND WHICH CONTAINS A ZONK
reveal = Random(2) + 1
Until reveal <> pick And config$(config, reveal) = "ZONK"
;TALLY THE RESULTS OF NOT SWITCHING
If config$(config, pick) = "PRIZE"
prize_no_switch + 1
Else
zonk_no_switch + 1
EndIf
;===========================================================================================
;SIMULATE EFFECT OF SWITCHING
config = Random(2) + 1 ;DIFFERENT CONFIGURATION CHOSEN AT RANDOM
pick = Random(2) + 1 ;CONTESTANT'S RANDOM SELECTION
Repeat ;PICK A DOOR WHICH HAS NOT BEEN SELECTED BY THE CONTESTANT AND WHICH CONTAINS A ZONK
reveal = Random(2) + 1
Until reveal <> pick And config$(config, reveal) = "ZONK"
;SWITCH TO THE DOOR NOT ALREADY REVEALED AND NOT THE CONTESTANT'S ORIGINAL PICK
If pick = 1 And reveal = 2
pick = 3
ElseIf pick = 1 And reveal = 3
pick = 2
ElseIf pick = 2 And reveal = 1
pick = 3
ElseIf pick = 2 And reveal = 3
pick = 1
ElseIf pick = 3 And reveal = 1
pick = 2
ElseIf pick = 3 And reveal = 2
pick = 1
EndIf
;TALLY THE RESULTS FOR SWITCHING
If config$(config, pick) = "PRIZE"
prize_switch + 1
Else
zonk_switch + 1
EndIf
Next
;PRINT THE RESULTS TO THE SCREEN
no_switch_total.f = prize_no_switch + zonk_no_switch
PrintN("No switching")
PrintN("Runs: " + Str(no_switch_total))
PrintN(Str(prize_no_switch / no_switch_total * 100) + "% wins")
switch_total.f = prize_switch + zonk_switch
PrintN(Chr(10) + "Switching")
PrintN("Runs: " + Str(switch_total))
PrintN(Str(prize_switch / switch_total * 100) + "% wins")
here: Delay(500): Goto here