"Monty Hall Problem" Simulator
Posted: Thu Sep 04, 2008 8:16 am
This program uses Monte Carlo simulation to demonstrate the "Monty Hall Problem" by playing it 1,000,000 times. It also demonstrates how fast PureBasic is at doing something 1,000,000 times. Explanation is in the comments and on Wikipedia.
http://en.wikipedia.org/wiki/Monty_Hall_problem
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