Monty Hall problem: Difference between revisions
Content added Content deleted
(Added zig submission for this task) |
m (Dialects of BASIC moved to the BASIC section.) |
||
Line 517: | Line 517: | ||
=={{header|BASIC}}== |
=={{header|BASIC}}== |
||
{{works with|QuickBasic|4.5}} |
|||
{{trans|Java}} |
|||
<syntaxhighlight lang="qbasic">RANDOMIZE TIMER |
|||
DIM doors(3) '0 is a goat, 1 is a car |
|||
CLS |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
FOR plays = 0 TO 32767 |
|||
winner = INT(RND * 3) + 1 |
|||
doors(winner) = 1'put a winner in a random door |
|||
choice = INT(RND * 3) + 1'pick a door, any door |
|||
DO |
|||
shown = INT(RND * 3) + 1 |
|||
'don't show the winner or the choice |
|||
LOOP WHILE doors(shown) = 1 OR shown = choice |
|||
stayWins = stayWins + doors(choice) 'if you won by staying, count it |
|||
switchWins = switchWins + doors(3 - choice - shown) 'could have switched to win |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT plays |
|||
PRINT "Switching wins"; switchWins; "times." |
|||
PRINT "Staying wins"; stayWins; "times."</syntaxhighlight> |
|||
Output: |
|||
<pre>Switching wins 21805 times. |
|||
Staying wins 10963 times.</pre> |
|||
==={{header|ANSI BASIC}}=== |
==={{header|ANSI BASIC}}=== |
||
{{trans|XPL0}} |
{{trans|XPL0}} |
||
Line 620: | Line 595: | ||
end |
end |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
==={{header|BBC BASIC}}=== |
|||
<syntaxhighlight lang="bbcbasic"> total% = 10000 |
|||
FOR trial% = 1 TO total% |
|||
prize_door% = RND(3) : REM. The prize is behind this door |
|||
guess_door% = RND(3) : REM. The contestant guesses this door |
|||
IF prize_door% = guess_door% THEN |
|||
REM. The contestant guessed right, reveal either of the others |
|||
reveal_door% = RND(2) |
|||
IF prize_door% = 1 reveal_door% += 1 |
|||
IF prize_door% = 2 AND reveal_door% = 2 reveal_door% = 3 |
|||
ELSE |
|||
REM. The contestant guessed wrong, so reveal the non-prize door |
|||
reveal_door% = prize_door% EOR guess_door% |
|||
ENDIF |
|||
stick_door% = guess_door% : REM. The sticker doesn't change his mind |
|||
swap_door% = guess_door% EOR reveal_door% : REM. but the swapper does |
|||
IF stick_door% = prize_door% sticker% += 1 |
|||
IF swap_door% = prize_door% swapper% += 1 |
|||
NEXT trial% |
|||
PRINT "After a total of ";total%;" trials," |
|||
PRINT "The 'sticker' won ";sticker%;" times (";INT(sticker%/total%*100);"%)" |
|||
PRINT "The 'swapper' won ";swapper%;" times (";INT(swapper%/total%*100);"%)"</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
After a total of 10000 trials, |
|||
The 'sticker' won 3379 times (33%) |
|||
The 'swapper' won 6621 times (66%) |
|||
</pre> |
|||
==={{header|Euphoria}}=== |
|||
<syntaxhighlight lang="euphoria">integer switchWins, stayWins |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
integer winner, choice, shown |
|||
for plays = 1 to 10000 do |
|||
winner = rand(3) |
|||
choice = rand(3) |
|||
while 1 do |
|||
shown = rand(3) |
|||
if shown != winner and shown != choice then |
|||
exit |
|||
end if |
|||
end while |
|||
stayWins += choice = winner |
|||
switchWins += 6-choice-shown = winner |
|||
end for |
|||
printf(1, "Switching wins %d times.\n", switchWins) |
|||
printf(1, "Staying wins %d times.\n", stayWins) |
|||
</syntaxhighlight> |
|||
{{out}} (sample) |
|||
<pre> |
|||
Switching wins 6697 times. |
|||
Staying wins 3303 times. |
|||
</pre> |
|||
==={{header|IS-BASIC}}=== |
==={{header|IS-BASIC}}=== |
||
Line 637: | Line 669: | ||
230 PRINT "Wins not changing doors:";NOTCHANGING,NOTCHANGING/NUMGAMES*100;"% of total." |
230 PRINT "Wins not changing doors:";NOTCHANGING,NOTCHANGING/NUMGAMES*100;"% of total." |
||
240 PRINT "Wins changing doors:",CHANGING,CHANGING/NUMGAMES*100;"% of total."</syntaxhighlight> |
240 PRINT "Wins changing doors:",CHANGING,CHANGING/NUMGAMES*100;"% of total."</syntaxhighlight> |
||
==={{header|Liberty BASIC}}=== |
|||
{{trans|Quick BASIC}} |
|||
{{works with|Just BASIC}} |
|||
<syntaxhighlight lang="lb"> |
|||
DIM doors(3) '0 is a goat, 1 is a car |
|||
total = 10000 'set desired number of iterations |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
FOR plays = 1 TO total |
|||
winner = INT(RND(1) * 3) + 1 |
|||
doors(winner) = 1'put a winner in a random door |
|||
choice = INT(RND(1) * 3) + 1'pick a door, any door |
|||
DO |
|||
shown = INT(RND(1) * 3) + 1 |
|||
'don't show the winner or the choice |
|||
LOOP WHILE doors(shown) = 1 OR shown = choice |
|||
if doors(choice) = 1 then |
|||
stayWins = stayWins + 1 'if you won by staying, count it |
|||
else |
|||
switchWins = switchWins + 1'could have switched to win |
|||
end if |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT |
|||
PRINT "Result for ";total;" games." |
|||
PRINT "Switching wins "; switchWins; " times." |
|||
PRINT "Staying wins "; stayWins; " times." |
|||
</syntaxhighlight> |
|||
{{out}} (example) |
|||
<pre> |
|||
Result for 10000 games. |
|||
Switching wins 6634 times. |
|||
Staying wins 3366 times.</pre> |
|||
==={{header|PureBasic}}=== |
|||
<syntaxhighlight lang="purebasic">Structure wins |
|||
stay.i |
|||
redecide.i |
|||
EndStructure |
|||
#goat = 0 |
|||
#car = 1 |
|||
Procedure MontyHall(*results.wins) |
|||
Dim Doors(2) |
|||
Doors(Random(2)) = #car |
|||
player = Random(2) |
|||
Select Doors(player) |
|||
Case #car |
|||
*results\redecide + #goat |
|||
*results\stay + #car |
|||
Case #goat |
|||
*results\redecide + #car |
|||
*results\stay + #goat |
|||
EndSelect |
|||
EndProcedure |
|||
OpenConsole() |
|||
#Tries = 1000000 |
|||
Define results.wins |
|||
For i = 1 To #Tries |
|||
MontyHall(@results) |
|||
Next |
|||
PrintN("Trial runs for each option: " + Str(#Tries)) |
|||
PrintN("Wins when redeciding: " + Str(results\redecide) + " (" + StrD(results\redecide / #Tries * 100, 2) + "% chance)") |
|||
PrintN("Wins when sticking: " + Str(results\stay) + " (" + StrD(results\stay / #Tries * 100, 2) + "% chance)") |
|||
Input()</syntaxhighlight> |
|||
Output:<pre>Trial runs for each option: 1000000 |
|||
Wins when redeciding: 666459 (66.65% chance) |
|||
Wins when sticking: 333541 (33.35% chance)</pre> |
|||
==={{header|QuickBASIC}}=== |
|||
{{works with|QuickBasic|4.5}} |
|||
{{trans|Java}} |
|||
<syntaxhighlight lang="qbasic">RANDOMIZE TIMER |
|||
DIM doors(3) '0 is a goat, 1 is a car |
|||
CLS |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
FOR plays = 0 TO 32767 |
|||
winner = INT(RND * 3) + 1 |
|||
doors(winner) = 1'put a winner in a random door |
|||
choice = INT(RND * 3) + 1'pick a door, any door |
|||
DO |
|||
shown = INT(RND * 3) + 1 |
|||
'don't show the winner or the choice |
|||
LOOP WHILE doors(shown) = 1 OR shown = choice |
|||
stayWins = stayWins + doors(choice) 'if you won by staying, count it |
|||
switchWins = switchWins + doors(3 - choice - shown) 'could have switched to win |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT plays |
|||
PRINT "Switching wins"; switchWins; "times." |
|||
PRINT "Staying wins"; stayWins; "times."</syntaxhighlight> |
|||
Output: |
|||
<pre>Switching wins 21805 times. |
|||
Staying wins 10963 times.</pre> |
|||
==={{header|Run BASIC}}=== |
|||
{{trans|Quick BASIC}} |
|||
{{works with|Just BASIC}} |
|||
<syntaxhighlight lang="runbasic"> |
|||
input "Number of tries;";tries ' gimme the number of iterations |
|||
FOR plays = 1 TO tries |
|||
winner = INT(RND(1) * 3) + 1 |
|||
doors(winner) = 1 'put a winner in a random door |
|||
choice = INT(RND(1) * 3) + 1 'pick a door please |
|||
[DO] shown = INT(RND(1) * 3) + 1 |
|||
' ------------------------------------------ |
|||
' don't show the winner or the choice |
|||
if doors(shown) = 1 then goto [DO] |
|||
if shown = choice then goto [DO] |
|||
if doors(choice) = 1 then |
|||
stayWins = stayWins + 1 ' if you won by staying, count it |
|||
else |
|||
switchWins = switchWins + 1 ' could have switched to win |
|||
end if |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT |
|||
PRINT " Result for ";tries;" games." |
|||
PRINT "Switching wins ";switchWins; " times." |
|||
PRINT " Staying wins ";stayWins; " times."</syntaxhighlight> |
|||
==={{header|Sinclair ZX81 BASIC}}=== |
==={{header|Sinclair ZX81 BASIC}}=== |
||
Line 666: | Line 825: | ||
STICK SWITCH |
STICK SWITCH |
||
341 659</pre> |
341 659</pre> |
||
==={{header|True BASIC}}=== |
==={{header|True BASIC}}=== |
||
Line 693: | Line 851: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
=={{header| |
==={{header|Yabasic}}=== |
||
<syntaxhighlight lang=" |
<syntaxhighlight lang="yabasic"> |
||
numTiradas = 1000000 |
|||
FOR trial% = 1 TO total% |
|||
prize_door% = RND(3) : REM. The prize is behind this door |
|||
guess_door% = RND(3) : REM. The contestant guesses this door |
|||
IF prize_door% = guess_door% THEN |
|||
REM. The contestant guessed right, reveal either of the others |
|||
reveal_door% = RND(2) |
|||
IF prize_door% = 1 reveal_door% += 1 |
|||
IF prize_door% = 2 AND reveal_door% = 2 reveal_door% = 3 |
|||
ELSE |
|||
REM. The contestant guessed wrong, so reveal the non-prize door |
|||
reveal_door% = prize_door% EOR guess_door% |
|||
ENDIF |
|||
stick_door% = guess_door% : REM. The sticker doesn't change his mind |
|||
swap_door% = guess_door% EOR reveal_door% : REM. but the swapper does |
|||
IF stick_door% = prize_door% sticker% += 1 |
|||
IF swap_door% = prize_door% swapper% += 1 |
|||
NEXT trial% |
|||
PRINT "After a total of ";total%;" trials," |
|||
PRINT "The 'sticker' won ";sticker%;" times (";INT(sticker%/total%*100);"%)" |
|||
PRINT "The 'swapper' won ";swapper%;" times (";INT(swapper%/total%*100);"%)"</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
After a total of 10000 trials, |
|||
The 'sticker' won 3379 times (33%) |
|||
The 'swapper' won 6621 times (66%) |
|||
</pre> |
|||
for i = 1 to numTiradas |
|||
=={{header|C}}== |
|||
pta_coche = int(ran(3)) + 1 |
|||
pta_elegida = int(ran(3)) + 1 |
|||
if pta_coche <> pta_elegida then |
|||
pta_montys = 6 - pta_coche - pta_elegida |
|||
else |
|||
repeat |
|||
pta_montys = int(ran(3)) + 1 |
|||
until pta_montys <> pta_coche |
|||
end if |
|||
// manteenr elección |
|||
if pta_coche = pta_elegida then permanece = permanece + 1 : fi |
|||
// cambiar elección |
|||
if pta_coche = 6 - pta_montys - pta_elegida then cambia = cambia + 1 : fi |
|||
next i |
|||
print "Si mantiene su eleccion, tiene un ", permanece / numTiradas * 100, "% de probabilidades de ganar." |
|||
print "Si cambia, tiene un ", cambia / numTiradas * 100, "% de probabilidades de ganar." |
|||
end |
|||
</syntaxhighlight> |
|||
=={{header|C}}== |
|||
<syntaxhighlight lang="c">//Evidence of the Monty Hall solution of marquinho1986 in C [github.com/marquinho1986] |
<syntaxhighlight lang="c">//Evidence of the Monty Hall solution of marquinho1986 in C [github.com/marquinho1986] |
||
Line 1,902: | Line 2,055: | ||
<pre>Switching wins 66595 times. |
<pre>Switching wins 66595 times. |
||
Staying wins 33405 times.</pre> |
Staying wins 33405 times.</pre> |
||
=={{header|Euphoria}}== |
|||
<syntaxhighlight lang="euphoria">integer switchWins, stayWins |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
integer winner, choice, shown |
|||
for plays = 1 to 10000 do |
|||
winner = rand(3) |
|||
choice = rand(3) |
|||
while 1 do |
|||
shown = rand(3) |
|||
if shown != winner and shown != choice then |
|||
exit |
|||
end if |
|||
end while |
|||
stayWins += choice = winner |
|||
switchWins += 6-choice-shown = winner |
|||
end for |
|||
printf(1, "Switching wins %d times\n", switchWins) |
|||
printf(1, "Staying wins %d times\n", stayWins) |
|||
</syntaxhighlight> |
|||
Sample Output:<br /> |
|||
:Switching wins 6697 times<br /> |
|||
:Staying wins 3303 times |
|||
=={{header|F_Sharp|F#}}== |
=={{header|F_Sharp|F#}}== |
||
Line 2,115: | Line 2,242: | ||
Chance of winning by not switching is 32.82% |
Chance of winning by not switching is 32.82% |
||
Chance of winning by switching is 67.18% |
Chance of winning by switching is 67.18% |
||
=={{header|FreeBASIC}}== |
|||
<syntaxhighlight lang="freebasic">' version 19-01-2019 |
|||
' compile with: fbc -s console |
|||
Const As Integer max = 1000000 |
|||
Randomize Timer |
|||
Dim As UInteger i, car_door, chosen_door, montys_door, stay, switch |
|||
For i = 1 To max |
|||
car_door = Fix(Rnd * 3) + 1 |
|||
chosen_door = Fix(Rnd * 3) + 1 |
|||
If car_door <> chosen_door Then |
|||
montys_door = 6 - car_door - chosen_door |
|||
Else |
|||
Do |
|||
montys_door = Fix(Rnd * 3) + 1 |
|||
Loop Until montys_door <> car_door |
|||
End If |
|||
'Print car_door,chosen_door,montys_door |
|||
' stay |
|||
If car_door = chosen_door Then stay += 1 |
|||
' switch |
|||
If car_door = 6 - montys_door - chosen_door Then switch +=1 |
|||
Next |
|||
Print Using "If you stick to your choice, you have a ##.## percent" _ |
|||
+ " chance to win"; stay / max * 100 |
|||
Print Using "If you switched, you have a ##.## percent chance to win"; _ |
|||
switch / max * 100 |
|||
' empty keyboard buffer |
|||
While InKey <> "" : Wend |
|||
Print : Print "hit any key to end program" |
|||
Sleep |
|||
End</syntaxhighlight> |
|||
{{out}} |
|||
<pre>If you stick to your choice, you have a 33.32 percent chance to win |
|||
If you switched, you have a 66.68 percent chance to win</pre> |
|||
=={{header|Fōrmulæ}}== |
=={{header|Fōrmulæ}}== |
||
{{FormulaeEntry|page=https://formulae.org/?script=examples/Monty_Hall_problem}} |
{{FormulaeEntry|page=https://formulae.org/?script=examples/Monty_Hall_problem}} |
||
Line 2,920: | Line 3,006: | ||
Switching wins 666330 times |
Switching wins 666330 times |
||
</pre> |
</pre> |
||
=={{header|Liberty BASIC}}== |
|||
<syntaxhighlight lang="lb"> |
|||
'adapted from BASIC solution |
|||
DIM doors(3) '0 is a goat, 1 is a car |
|||
total = 10000 'set desired number of iterations |
|||
switchWins = 0 |
|||
stayWins = 0 |
|||
FOR plays = 1 TO total |
|||
winner = INT(RND(1) * 3) + 1 |
|||
doors(winner) = 1'put a winner in a random door |
|||
choice = INT(RND(1) * 3) + 1'pick a door, any door |
|||
DO |
|||
shown = INT(RND(1) * 3) + 1 |
|||
'don't show the winner or the choice |
|||
LOOP WHILE doors(shown) = 1 OR shown = choice |
|||
if doors(choice) = 1 then |
|||
stayWins = stayWins + 1 'if you won by staying, count it |
|||
else |
|||
switchWins = switchWins + 1'could have switched to win |
|||
end if |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT |
|||
PRINT "Result for ";total;" games." |
|||
PRINT "Switching wins "; switchWins; " times." |
|||
PRINT "Staying wins "; stayWins; " times." |
|||
</syntaxhighlight> |
|||
Output: |
|||
<pre> |
|||
Result for 10000 games. |
|||
Switching wins 6634 times. |
|||
Staying wins 3366 times.</pre> |
|||
=={{header|Lua}}== |
=={{header|Lua}}== |
||
Line 3,823: | Line 3,875: | ||
Staying wins 332 out of 1000. |
Staying wins 332 out of 1000. |
||
</pre> |
</pre> |
||
=={{header|PureBasic}}== |
|||
<syntaxhighlight lang="purebasic">Structure wins |
|||
stay.i |
|||
redecide.i |
|||
EndStructure |
|||
#goat = 0 |
|||
#car = 1 |
|||
Procedure MontyHall(*results.wins) |
|||
Dim Doors(2) |
|||
Doors(Random(2)) = #car |
|||
player = Random(2) |
|||
Select Doors(player) |
|||
Case #car |
|||
*results\redecide + #goat |
|||
*results\stay + #car |
|||
Case #goat |
|||
*results\redecide + #car |
|||
*results\stay + #goat |
|||
EndSelect |
|||
EndProcedure |
|||
OpenConsole() |
|||
#Tries = 1000000 |
|||
Define results.wins |
|||
For i = 1 To #Tries |
|||
MontyHall(@results) |
|||
Next |
|||
PrintN("Trial runs for each option: " + Str(#Tries)) |
|||
PrintN("Wins when redeciding: " + Str(results\redecide) + " (" + StrD(results\redecide / #Tries * 100, 2) + "% chance)") |
|||
PrintN("Wins when sticking: " + Str(results\stay) + " (" + StrD(results\stay / #Tries * 100, 2) + "% chance)") |
|||
Input()</syntaxhighlight> |
|||
Output:<pre>Trial runs for each option: 1000000 |
|||
Wins when redeciding: 666459 (66.65% chance) |
|||
Wins when sticking: 333541 (33.35% chance)</pre> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
||
Line 4,363: | Line 4,374: | ||
<pre>Staying wins 33.84% of the time. |
<pre>Staying wins 33.84% of the time. |
||
Switching wins 66.16% of the time.</pre> |
Switching wins 66.16% of the time.</pre> |
||
=={{header|Run BASIC}}== |
|||
<syntaxhighlight lang="runbasic">' adapted from BASIC solution |
|||
input "Number of tries;";tries ' gimme the number of iterations |
|||
FOR plays = 1 TO tries |
|||
winner = INT(RND(1) * 3) + 1 |
|||
doors(winner) = 1 'put a winner in a random door |
|||
choice = INT(RND(1) * 3) + 1 'pick a door please |
|||
[DO] shown = INT(RND(1) * 3) + 1 |
|||
' ------------------------------------------ |
|||
' don't show the winner or the choice |
|||
if doors(shown) = 1 then goto [DO] |
|||
if shown = choice then goto [DO] |
|||
if doors(choice) = 1 then |
|||
stayWins = stayWins + 1 ' if you won by staying, count it |
|||
else |
|||
switchWins = switchWins + 1 ' could have switched to win |
|||
end if |
|||
doors(winner) = 0 'clear the doors for the next test |
|||
NEXT |
|||
PRINT " Result for ";tries;" games." |
|||
PRINT "Switching wins ";switchWins; " times." |
|||
PRINT " Staying wins ";stayWins; " times."</syntaxhighlight> |
|||
=={{header|Rust}}== |
=={{header|Rust}}== |
||
Line 5,129: | Line 5,116: | ||
=={{header|Vedit macro language}}== |
=={{header|Vedit macro language}}== |
||
{{trans| |
{{trans|QuickBASIC}} |
||
Vedit macro language does not have random number generator, so one is implemented in subroutine RANDOM (the algorithm was taken from ANSI C library). |
Vedit macro language does not have random number generator, so one is implemented in subroutine RANDOM (the algorithm was taken from ANSI C library). |
||
Line 5,320: | Line 5,307: | ||
But switching doors wins car in 66.7% of games. |
But switching doors wins car in 66.7% of games. |
||
</pre> |
</pre> |
||
=={{header|Yabasic}}== |
|||
<syntaxhighlight lang="yabasic"> |
|||
numTiradas = 1000000 |
|||
for i = 1 to numTiradas |
|||
pta_coche = int(ran(3)) + 1 |
|||
pta_elegida = int(ran(3)) + 1 |
|||
if pta_coche <> pta_elegida then |
|||
pta_montys = 6 - pta_coche - pta_elegida |
|||
else |
|||
repeat |
|||
pta_montys = int(ran(3)) + 1 |
|||
until pta_montys <> pta_coche |
|||
end if |
|||
// manteenr elección |
|||
if pta_coche = pta_elegida then permanece = permanece + 1 : fi |
|||
// cambiar elección |
|||
if pta_coche = 6 - pta_montys - pta_elegida then cambia = cambia + 1 : fi |
|||
next i |
|||
print "Si mantiene su eleccion, tiene un ", permanece / numTiradas * 100, "% de probabilidades de ganar." |
|||
print "Si cambia, tiene un ", cambia / numTiradas * 100, "% de probabilidades de ganar." |
|||
end |
|||
</syntaxhighlight> |
|||
=={{header|Zig}}== |
=={{header|Zig}}== |