Simulating the Monty Hall problem
Author |
Message |
CaptainShrimps
|
Posted: Sun Apr 28, 2013 9:43 am Post subject: Simulating the Monty Hall problem |
|
|
I wrote a program to simulate the Monty Hall problem to show my dad that the odds are only 50/50 if you randomly choose to stay with your original choice or switch to the other door. He said my code was wrong, so I'm posting it here to see what everyone thinks.
code: |
%This program is supposed to simulate the Monty Hall problem.
var winID : int
winID := Window.Open ("position:top;right,graphics:1024;512")
var correct:int %Counts the number of correct choices
var a,b,c :boolean:=false %3 doors
var d:int %Represents the door the prize is behind
var q:int %1 is stay, 2 is switch, 3 is random
var ch:string(1)
var randm :boolean
proc playerchoose
cls
randm:=false
put "Type 1 to always stay, type 2 to always switch, 3 for random."
put "There are 10000 trials. The number of times the correct door was chosen is displayed."
get q
if q=3 then
randm:=true
end if
put "Press any key to start."
getch (ch)
end playerchoose
proc prizegen %Generates which door the prize is behind
a:=false
b:=false
c:=false
d:=Rand.Int(1,3)
if d=1 then
a:= true
elsif d=2 then
b:=true
elsif d=3 then
c:=true
end if
end prizegen
proc pickdoor %Randomy pick a door, then stay or switch based on input from the start
var d:int:=Rand.Int(1,3)
if randm=true then
q:= Rand.Int(1,2)
end if
if d=1 then
if a=true then
if q=1 then
correct+=1
elsif q=2 then
correct+=0
end if
elsif b=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
elsif c=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
end if
elsif d=2 then
if a=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
elsif b=true then
if q=1 then
correct+=1
elsif q=2 then
correct+=0
end if
elsif c=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
end if
elsif d=3 then
if a=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
elsif b=true then
if q=1 then
correct+=0
elsif q=2 then
correct+=1
end if
elsif c=true then
if q=1 then
correct+=1
elsif q=2 then
correct+=0
end if
end if
end if
end pickdoor
proc try %Repeat 10000 times
for i:1..10000
prizegen
pickdoor
end for
put correct," out of 10000 correct."
end try
loop
correct:=0
playerchoose
try
put "Press any key to restart or press ESC to quit."
getch (ch)
if ch=(KEY_ESC) then
Window.Close (winID)
exit
end if
end loop
|
|
|
|
|
|
|
Sponsor Sponsor
|
|
|
evildaddy911
|
Posted: Sun Apr 28, 2013 11:11 am Post subject: RE:Simulating the Monty Hall problem |
|
|
the output IS accurate.
* when you switch the chance of being right is 2 in 3
* when you stay, the chance of being right drops to 1 in 3
* if you randomly choose stay or switch, the chance should be the the average of the 2 options, making the chance 1.5 in 3, or 1 in 2 |
|
|
|
|
|
nullptr
|
Posted: Wed May 01, 2013 10:42 pm Post subject: Re: Simulating the Monty Hall problem |
|
|
The Monty Hall problem is one of those problems that seems so much a common-sense question that people will very stubbornly defend their answers. Good luck convincing your dad -- your code looks good to me. |
|
|
|
|
|
DemonWasp
|
Posted: Thu May 02, 2013 12:13 am Post subject: RE:Simulating the Monty Hall problem |
|
|
In general, shorter code is easier to prove correct (or at least assure yourself it is correct). Here's my take on the code, which displays each individual trial. Even with trials = 20, the pattern is very likely to be obvious:
Turing: |
const TRIALS : int := 20
var correct_stay, correct_switch : int := 0
put "DOOR CHOICE WINNING STRATEGY"
for i : 1 .. TRIALS
var door : int := Rand.Int(1,3)
var choice : int := Rand.Int(1,3)
if door = choice then
put " ", door, " ", choice, " stay"
correct_stay += 1
else
put " ", door, " ", choice, " switch"
correct_switch += 1
end if
end for
put "STAY: ", 100 * correct_stay / TRIALS, "%"
put "SWITCH: ", 100 * correct_switch / TRIALS, "%"
|
The other argument you could use is this:
1. You have a 1-in-3 chance of choosing correctly at first.
2. If you chose correctly (1 in 3), then staying wins 100% of the time but switching loses 100% of the time.
3. If you chose incorrectly (2 in 3), then switching wins 100% of the time but staying loses 100% of the time.
Because case #2 has only a 1-in-3 chance of occurring, staying only wins in 1-in-3 cases. |
|
|
|
|
|
|
|