Monty Hall problem: Difference between revisions

m
syntax highlighting fixup automation
m (→‎{{header|R}}: nonsense: apply functions are not faster than a for loop, they have basically the same problem: not vectorized, i.e. one function call per element.)
m (syntax highlighting fixup automation)
Line 47:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">V stay = 0
V sw = 0
 
Line 71:
 
print(‘Stay = ’stay)
print(‘Switch = ’sw)</langsyntaxhighlight>
 
=={{header|8086 Assembly}}==
 
<langsyntaxhighlight lang="asm">time: equ 2Ch ; MS-DOS syscall to get current time
puts: equ 9 ; MS-DOS syscall to print a string
cpu 8086
Line 153:
nsw: db 'When not switching doors: $'
db '*****'
number: db 13,10,'$'</langsyntaxhighlight>
 
{{out}}
Line 161:
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">package {
import flash.display.Sprite;
 
Line 192:
}
}
}</langsyntaxhighlight>
Output:
<pre>Switching wins 18788 times. (62.626666666666665%)
Line 198:
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">-- Monty Hall Game
 
with Ada.Text_Io; use Ada.Text_Io;
Line 273:
Put_Line("%");
 
end Monty_Stats;</langsyntaxhighlight>
Results
<pre>Stay : count 34308 = 34.31%
Line 284:
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}}
<langsyntaxhighlight lang="algol68">INT trials=100 000;
 
PROC brand = (INT n)INT: 1 + ENTIER (n * random);
Line 337:
print(("Changing: ", percent(change winning), new line ));
print(("New random choice: ", percent(random winning), new line ))
)</langsyntaxhighlight>
Sample output:
<pre>
Line 346:
 
=={{header|APL}}==
<langsyntaxhighlight lang="apl"> ∇ Run runs;doors;i;chosen;cars;goats;swap;stay;ix;prices
[1] ⍝0: Monthy Hall problem
[2] ⍝1: http://rosettacode.org/wiki/Monty_Hall_problem
Line 360:
[12] ⎕←'Swap: ',(2⍕100×(swap÷runs)),'% it''s a car'
[13] ⎕←'Stay: ',(2⍕100×(stay÷runs)),'% it''s a car'
∇</langsyntaxhighlight>
<pre>
Run 100000
Line 371:
{{trans|Nim}}
 
<langsyntaxhighlight lang="rebol">stay: 0
swit: 0
 
Line 394:
 
print ["Stay:" stay]
print ["Switch:" swit]</langsyntaxhighlight>
 
{{out}}
Line 402:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang="ahk">#SingleInstance, Force
Iterations = 1000
Loop, %Iterations%
Line 435:
Mode := Mode = 2 ? 2*rand - 1: Mode
Return, Mode = 1 ? 6 - guess - show = actual : guess = actual
}</langsyntaxhighlight>
Sample output:
<pre>
Line 448:
 
=={{header|AWK}}==
<langsyntaxhighlight lang="awk">#!/bin/gawk -f
 
# Monty Hall problem
Line 504:
simulate(RAND)
}</langsyntaxhighlight>
Sample output:
<langsyntaxhighlight lang="awk">bash$ ./monty_hall.awk
 
Monty Hall problem simulation:
Line 514:
Algorithm switch: prize count = 6655, = 66.55%
Algorithm random: prize count = 4991, = 49.91%
bash$</langsyntaxhighlight>
 
=={{header|BASIC}}==
{{works with|QuickBasic|4.5}}
{{trans|Java}}
<langsyntaxhighlight lang="qbasic">RANDOMIZE TIMER
DIM doors(3) '0 is a goat, 1 is a car
CLS
Line 537:
NEXT plays
PRINT "Switching wins"; switchWins; "times."
PRINT "Staying wins"; stayWins; "times."</langsyntaxhighlight>
Output:
<pre>Switching wins 21805 times.
Line 544:
 
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">
<lang BASIC256>
numTiradas = 1000000
permanece = 0
Line 568:
print "Si cambia, tiene un "; cambia / numTiradas * 100; "% de probabilidades de ganar."
end
</syntaxhighlight>
</lang>
 
==={{header|IS-BASIC}}===
<langsyntaxhighlight ISlang="is-BASICbasic">100 PROGRAM "MontyH.bas"
110 RANDOMIZE
120 LET NUMGAMES=1000
Line 585:
220 PRINT "Num of games:";NUMGAMES
230 PRINT "Wins not changing doors:";NOTCHANGING,NOTCHANGING/NUMGAMES*100;"% of total."
240 PRINT "Wins changing doors:",CHANGING,CHANGING/NUMGAMES*100;"% of total."</langsyntaxhighlight>
 
==={{header|Sinclair ZX81 BASIC}}===
Line 596:
switcher wins;</pre>
but I take it that the point is to demonstrate the outcome to people who may <i>not</i> see that that's what is going on. I have therefore written the program in a deliberately naïve style, not assuming anything.
<langsyntaxhighlight lang="basic"> 10 PRINT " WINS IF YOU"
20 PRINT "STICK","SWITCH"
30 LET STICK=0
Line 610:
130 IF NEWGUESS=CAR THEN LET SWITCH=SWITCH+1
140 NEXT I
150 PRINT AT 2,0;STICK,SWITCH</langsyntaxhighlight>
{{out}}
<pre> WINS IF YOU
Line 618:
 
==={{header|True BASIC}}===
<langsyntaxhighlight lang="basic">
LET numTiradas = 1000000
 
Line 640:
PRINT "Mantenerse gana el"; cambia / numTiradas * 100; "% de las veces."
END
</syntaxhighlight>
</lang>
 
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang="bbcbasic"> total% = 10000
FOR trial% = 1 TO total%
prize_door% = RND(3) : REM. The prize is behind this door
Line 664:
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);"%)"</langsyntaxhighlight>
Output:
<pre>
Line 674:
=={{header|C}}==
 
<langsyntaxhighlight lang="c">//Evidence of the Monty Hall solution.
 
#include <stdio.h>
Line 697:
printf("\nAfter %u games, I won %u by switching. That is %f%%. ", GAMES, winsbyswitch, (float)winsbyswitch*100.0/(float)i);
}
</syntaxhighlight>
</lang>
 
Output of one run:
Line 705:
=={{header|C sharp|C#}}==
{{trans|Java}}
<langsyntaxhighlight lang="csharp">using System;
 
class Program
Line 740:
Console.Out.WriteLine("Switching wins " + switchWins + " times.");
}
}</langsyntaxhighlight>
Sample output:
<pre>
Line 748:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <cstdlib>
#include <ctime>
Line 804:
int wins_change = check(games, true);
std::cout << "staying: " << 100.0*wins_stay/games << "%, changing: " << 100.0*wins_change/games << "%\n";
}</langsyntaxhighlight>
Sample output:
staying: 33.73%, changing: 66.9%
 
=={{header|Chapel}}==
<langsyntaxhighlight lang="chapel">use Random;
 
param doors: int = 3;
Line 860:
writeln( "Both methods are equal." );
}
</syntaxhighlight>
</lang>
Sample output:
<pre>
Line 869:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(ns monty-hall-problem
(:use [clojure.contrib.seq :only (shuffle)]))
 
Line 884:
(range times))]
(str "wins " wins " times out of " times)))
</syntaxhighlight>
</lang>
<langsyntaxhighlight lang="clojure">monty-hall-problem> (println "staying:" (simulate true 1000))
staying: wins 337 times out of 1000
nil
Line 891:
switching: wins 638 times out of 1000
nil
</syntaxhighlight>
</lang>
 
=={{header|COBOL}}==
{{works with|OpenCOBOL}}
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. monty-hall.
 
Line 983:
END PROGRAM get-rand-int.
 
END PROGRAM monty-hall.</langsyntaxhighlight>
 
{{out}}
Line 992:
 
=={{header|ColdFusion}}==
<langsyntaxhighlight lang="cfm"><cfscript>
function runmontyhall(num_tests) {
// number of wins when player switches after original selection
Line 1,033:
}
runmontyhall(10000);
</cfscript></langsyntaxhighlight>
Output:
<pre>
Line 1,040:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun make-round ()
(let ((array (make-array 3
:element-type 'bit
Line 1,054:
 
(defun won? (array i)
(= 1 (bit array i)))</langsyntaxhighlight>
<langsyntaxhighlight lang="lisp">CL-USER> (progn (loop repeat #1=(expt 10 6)
for round = (make-round)
for initial = (random 3)
Line 1,072:
#1# 1/100))))))
Stay: 33.2716%
Switch: 66.6593%</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lisp">
;Find out how often we win if we always switch
(defun rand-elt (s)
Line 1,089:
(defun monty-trials (n)
(count t (loop for x from 1 to n collect (monty))))
</syntaxhighlight>
</lang>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.random;
 
void main() {
Line 1,122:
 
writefln("Switching/Staying wins: %d %d", switchWins, stayWins);
}</langsyntaxhighlight>
{{out}}
<pre>Switching/Staying wins: 66609 33391</pre>
Line 1,128:
=={{header|Dart}}==
The class Game attempts to hide the implementation as much as possible, the play() function does not use any specifics of the implementation.
<langsyntaxhighlight lang="dart">int rand(int max) => (Math.random()*max).toInt();
 
class Game {
Line 1,210:
play(10000,false);
play(10000,true);
}</langsyntaxhighlight>
<pre>playing without switching won 33.32%
playing with switching won 67.63%</pre>
Line 1,218:
{{works with|Delphi|XE10}}
{{libheader| System.SysUtils}}
<langsyntaxhighlight Delphilang="delphi">program MontyHall;
 
{$APPTYPE CONSOLE}
Line 1,267:
WriteLn('Switching wins ' + IntToStr(switchWins) + ' times.');
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>Staying wins 333253 times.
Line 1,276:
{{trans|C#}}
 
<langsyntaxhighlight lang="dyalect">var switchWins = 0
var stayWins = 0
Line 1,295:
print("Staying wins \(stayWins) times.")
print("Switching wins \(switchWins) times.")</langsyntaxhighlight>
 
{{out}}
Line 1,303:
 
=={{header|Eiffel}}==
<langsyntaxhighlight lang="eiffel">
note
description: "[
Line 1,617:
 
end
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,637:
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule MontyHall do
def simulate(n) do
{stay, switch} = simulate(n, 0, 0)
Line 1,659:
end
 
MontyHall.simulate(10000)</langsyntaxhighlight>
 
{{out}}
Line 1,669:
=={{header|Emacs Lisp}}==
{{trans|Picolisp}}
<langsyntaxhighlight lang="lisp">(defun montyhall (keep)
(let ((prize (random 3))
(choice (random 3)))
Line 1,683:
(dotimes (i 10000)
(and (montyhall nil) (setq cnt (1+ cnt))))
(message "Strategy switch: %.3f%%" (/ cnt 100.0)))</langsyntaxhighlight>
 
{{out}}
Line 1,691:
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">-module(monty_hall).
 
-export([main/0]).
Line 1,718:
false -> OpenDoor
end.
</syntaxhighlight>
</lang>
Sample Output:
<pre>Switching wins 66595 times.
Line 1,724:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">integer switchWins, stayWins
switchWins = 0
stayWins = 0
Line 1,744:
printf(1, "Switching wins %d times\n", switchWins)
printf(1, "Staying wins %d times\n", stayWins)
</syntaxhighlight>
</lang>
Sample Output:<br />
:Switching wins 6697 times<br />
Line 1,751:
=={{header|F_Sharp|F#}}==
I don't bother with having Monty "pick" a door, since you only win if you initially pick a loser in the switch strategy and you only win if you initially pick a winner in the stay strategy so there doesn't seem to be much sense in playing around the background having Monty "pick" doors. Makes it pretty simple to see why it's always good to switch.
<langsyntaxhighlight lang="fsharp">open System
let monty nSims =
let rnd = new Random()
Line 1,763:
 
let Wins (f:unit -> int) = seq {for i in [1..nSims] -> f()} |> Seq.sum
printfn "Stay: %d wins out of %d - Switch: %d wins out of %d" (Wins StayGame) nSims (Wins SwitchGame) nSims</langsyntaxhighlight>
Sample Output:
<pre>Stay: 332874 wins out of 1000000 - Switch: 667369 wins out of 1000000</pre>
 
I had a very polite suggestion that I simulate Monty's "pick" so I'm putting in a version that does that. I compare the outcome with my original outcome and, unsurprisingly, show that this is essentially a noop that has no bearing on the output, but I (kind of) get where the request is coming from so here's that version...
<langsyntaxhighlight lang="fsharp">let montySlower nSims =
let rnd = new Random()
let MontyPick winner pick =
Line 1,799:
 
let Wins (f:unit -> int) = seq {for i in [1..nSims] -> f()} |> Seq.sum
printfn "Stay: %d wins out of %d - Switch: %d wins out of %d" (Wins StayGame) nSims (Wins SwitchGame) nSims</langsyntaxhighlight>
 
=={{header|Forth}}==
 
===version 1===
<langsyntaxhighlight lang="forth">include random.fs
 
variable stay-wins
Line 1,820:
cr switch-wins @ . [char] / emit . ." switching wins" ;
 
1000 trials</langsyntaxhighlight>
 
or in iForth:
 
<langsyntaxhighlight lang="forth">0 value stay-wins
0 value switch-wins
 
Line 1,837:
dup 0 ?DO trial LOOP
CR stay-wins DEC. ." / " dup DEC. ." staying wins,"
CR switch-wins DEC. ." / " DEC. ." switching wins." ;</langsyntaxhighlight>
 
With output:
Line 1,848:
{{works with|GNU Forth}}
While Forthers are known (and regarded) for always simplifying the problem, I think version 1 is missing the point here. The optimization can only be done if one already understands the game. For what it's worth, here is a simulation that takes all the turns of the game.
<langsyntaxhighlight Forthlang="forth">require random.fs
here seed !
 
Line 1,876:
' keep IS applyStrategy run ." Keep door => " .result cr
' switch IS applyStrategy run ." Switch door => " .result cr
bye</langsyntaxhighlight>
 
{{out}}
Line 1,886:
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">PROGRAM MONTYHALL
IMPLICIT NONE
Line 1,931:
WRITE(*, "(A,F6.2,A)") "Chance of winning by switching is", real(switchcount)/trials*100, "%"
 
END PROGRAM MONTYHALL</langsyntaxhighlight>
Sample Output
Chance of winning by not switching is 32.82%
Line 1,937:
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 19-01-2019
' compile with: fbc -s console
 
Line 1,971:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre>If you stick to your choice, you have a 33.32 percent chance to win
Line 1,985:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,011:
fmt.Printf("Keeper Wins: %d (%3.2f%%)",
keeperWins, (float32(keeperWins) / floatGames * 100))
}</langsyntaxhighlight>
Output:
<pre>
Line 2,019:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import System.Random (StdGen, getStdGen, randomR)
 
trials :: Int
Line 2,052:
percent n ++ "% of the time."
percent n = show $ round $
100 * (fromIntegral n) / (fromIntegral trials)</langsyntaxhighlight>
 
{{libheader|mtl}}
With a <tt>State</tt> monad, we can avoid having to explicitly pass around the <tt>StdGen</tt> so often. <tt>play</tt> and <tt>cars</tt> can be rewritten as follows:
 
<langsyntaxhighlight lang="haskell">import Control.Monad.State
 
play :: Bool -> State StdGen Door
Line 2,077:
cars n switch g = (numcars, new_g)
where numcars = length $ filter (== Car) prize_list
(prize_list, new_g) = runState (replicateM n (play switch)) g</langsyntaxhighlight>
 
Sample output (for either implementation):
<langsyntaxhighlight lang="haskell">The switch strategy succeeds 67% of the time.
The stay strategy succeeds 34% of the time.</langsyntaxhighlight>
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest">REAL :: ndoors=3, doors(ndoors), plays=1E4
 
DLG(NameEdit = plays, DNum=1, Button='Go')
Line 2,115:
WRITE(ClipBoard, Name) plays, switchWins, stayWins
 
END</langsyntaxhighlight>
<langsyntaxhighlight lang="hicest">! plays=1E3; switchWins=695; stayWins=305;
! plays=1E4; switchWins=6673; stayWins=3327;
! plays=1E5; switchWins=66811; stayWins=33189;
! plays=1E6; switchWins=667167; stayWins=332833;</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main(arglist)
 
rounds := integer(arglist[1]) | 10000
Line 2,140:
write("Strategy 2 'Switching' won ", real(strategy2) / rounds )
 
end</langsyntaxhighlight>
 
Sample Output:<pre>Monty Hall simulation for 10000 rounds.
Line 2,147:
 
=={{header|Io}}==
<langsyntaxhighlight Iolang="io">keepWins := 0
switchWins := 0
doors := 3
Line 2,169:
.. "Keeping the same door won #{keepWins} times.\n"\
.. "Game played #{times} times with #{doors} doors.") interpolate println
</syntaxhighlight>
</lang>
Sample output:<pre>Switching to the other door won 66935 times.
Keeping the same door won 33065 times.
Line 2,178:
The core of this simulation is picking a random item from a set
 
<langsyntaxhighlight lang="j">pick=: {~ ?@#</langsyntaxhighlight>
 
And, of course, we will be picking one door from three doors
 
<langsyntaxhighlight lang="j">DOORS=:1 2 3</langsyntaxhighlight>
 
But note that the simulation code should work just as well with more doors.
Line 2,188:
Anyways the scenario where the contestant's switch or stay strategy makes a difference is where Monty has picked from the doors which are neither the user's door nor the car's door.
 
<langsyntaxhighlight lang="j">scenario=: ((pick@-.,])pick,pick) bind DOORS</langsyntaxhighlight>
 
(Here, I have decided that the result will be a list of three door numbers. The first number in that list is the number Monty picks, the second number represents the door the user picked, and the third number represents the door where the car is hidden.)
Line 2,194:
Once we have our simulation test results for the scenario, we need to test if staying would win. In other words we need to test if the user's first choice matches where the car was hidden:
 
<langsyntaxhighlight lang="j">stayWin=: =/@}.</langsyntaxhighlight>
 
In other words: drop the first element from the list representing our test results -- this leaves us with the user's choice and the door where the car was hidden -- and then insert the verb <code>=</code> between those two values.
Line 2,200:
We also need to test if switching would win. In other words, we need to test if the user would pick the car from the doors other than the one Monty picked and the one the user originally picked:
 
<langsyntaxhighlight lang="j">switchWin=: pick@(DOORS -. }:) = {:</langsyntaxhighlight>
 
In other words, start with our list of all doors and then remove the door the monty picked and the door the user picked, and then pick one of the remaining doors at random (the pick at random part is only significant if there were originally more than 3 doors) and see if that matches the door where the car is.
Line 2,206:
Finally, we need to run the simulation a thousand times and count how many times each strategy wins:
 
<langsyntaxhighlight lang="j"> +/ (stayWin,switchWin)@scenario"0 i.1000
320 680</langsyntaxhighlight>
 
Or, we could bundle this all up as a defined word. Here, the (optional) left argument "names" the doors and the right argument says how many simulations to run:
 
<langsyntaxhighlight lang="j">simulate=:3 :0
1 2 3 simulate y
:
Line 2,221:
labels=. ];.2 'limit stay switch '
smoutput labels,.":"0 y,+/r
)</langsyntaxhighlight>
 
Example use:
 
<langsyntaxhighlight lang="j"> simulate 1000
limit 1000
stay 304
switch 696 </langsyntaxhighlight>
 
Or, with more doors (and assuming this does not require new rules about how Monty behaves or how the player behaves):
 
<langsyntaxhighlight lang="j"> 1 2 3 4 simulate 1000
limit 1000
stay 233
switch 388 </langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.util.Random;
public class Monty{
public static void main(String[] args){
Line 2,262:
System.out.println("Staying wins " + stayWins + " times.");
}
}</langsyntaxhighlight>
Output:
<pre>Switching wins 21924 times.
Line 2,273:
This solution can test with n doors, the difference in probability for switching is shown to diminish as the number of doors increases.
 
<langsyntaxhighlight lang="javascript">
function montyhall(tests, doors) {
'use strict';
Line 2,312:
};
}
</syntaxhighlight>
</lang>
 
{{out}}
<langsyntaxhighlight lang="javascript">
montyhall(1000, 3)
Object {stayWins: "349 34.9%", switchWins: "651 65.1%"}
Line 2,322:
montyhall(1000, 5)
Object {stayWins: "202 20.2%", switchWins: "265 26.5%"}
</syntaxhighlight>
</lang>
 
Slight modification of the script above for modularity inside of HTML.
<langsyntaxhighlight lang="javascript"><html>
 
<body>
Line 2,373:
}
 
</script></langsyntaxhighlight>
'''Output:'''
<langsyntaxhighlight lang="javascript">(1000, 3)
First Door Wins: 346 | 34.6%
Switching Door Wins: 654 | 65.4%</langsyntaxhighlight>
 
===Basic Solution===
 
<!-- http://blog.dreasgrech.com/2011/09/simulating-monty-hall-problem.html -->
<langsyntaxhighlight lang="javascript">
var totalGames = 10000,
selectDoor = function () {
Line 2,427:
console.log("Wins when not switching door", play(false));
console.log("Wins when switching door", play(true));
</syntaxhighlight>
</lang>
 
{{out}}
<langsyntaxhighlight lang="javascript">
Playing 10000 games
Wins when not switching door 3326
Wins when switching door 6630
</syntaxhighlight>
</lang>
 
=={{header|jq}}==
Line 2,453:
This solution is based on the observation: {{quote|If I initially guessed the winning door and didn't switch, or if I initially guessed a losing door but then switched, I've won.}}
 
<langsyntaxhighlight lang="jq">def rand:
input as $r
| if $r < . then $r else rand end;
Line 2,470:
"Switching wins \(.switchWins) times\n" ;
 
1e3, 1e6 | logical_montyHall</langsyntaxhighlight>
 
====Simulation====
{{trans|Kotlin}}
<langsyntaxhighlight lang="jq">def rand:
input as $r
| if $r < . then $r else rand end;
Line 2,499:
"Switching wins \(.switchWins) times\n" ;
1e3, 1e6 | montyHall</langsyntaxhighlight>
{{out}}
<pre>
Line 2,517:
 
'''The Literal Simulation Function'''
<langsyntaxhighlight Julialang="julia">using Printf
 
function play_mh_literal{T<:Integer}(ncur::T=3, ncar::T=1)
Line 2,539:
return (isstickwin, isswitchwin)
end
</syntaxhighlight>
</lang>
 
'''The Clean Simulation Function'''
<syntaxhighlight lang="julia">
<lang Julia>
function play_mh_clean{T<:Integer}(ncur::T=3, ncar::T=1)
ncar < ncur || throw(DomainError())
Line 2,554:
return (isstickwin, isswitchwin)
end
</syntaxhighlight>
</lang>
 
'''Supporting Functions'''
<syntaxhighlight lang="julia">
<lang Julia>
function mh_results{T<:Integer}(ncur::T, ncar::T,
nruns::T, play_mh::Function)
Line 2,602:
return nothing
end
</syntaxhighlight>
</lang>
 
'''Main'''
<syntaxhighlight lang="julia">
<lang Julia>
for i in 3:5, j in 1:(i-2)
show_simulation(i, j, 10^5)
end
</syntaxhighlight>
</lang>
 
This code shows, for a variety of configurations, the results for 3 solutions: literal simulation, clean simulation, analytic. Stick is the percentage of times that the player wins a car by sticking to an initial choice. Switch is the winning percentage the comes with switching one's selection following the goat reveal. Improvement is the ratio of switch to stick.
Line 2,677:
=={{header|Kotlin}}==
{{trans|Java}}
<langsyntaxhighlight lang="scala">// version 1.1.2
 
import java.util.Random
Line 2,704:
fun main(args: Array<String>) {
montyHall(1_000_000)
}</langsyntaxhighlight>
Sample output:
{{out}}
Line 2,714:
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
<lang lb>
'adapted from BASIC solution
DIM doors(3) '0 is a goat, 1 is a car
Line 2,740:
PRINT "Switching wins "; switchWins; " times."
PRINT "Staying wins "; stayWins; " times."
</syntaxhighlight>
</lang>
Output:
<pre>
Line 2,748:
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function playgame(player)
local car = math.random(3)
local pchoice = player.choice()
Line 2,764:
for i = 1, 20000 do playgame(player) end
print(player.wins)
end</langsyntaxhighlight>
 
=={{header|Lua/Torch}}==
<langsyntaxhighlight lang="lua">function montyHall(n)
local car = torch.LongTensor(n):random(3) -- door with car
local choice = torch.LongTensor(n):random(3) -- player's choice
Line 2,793:
end
 
montyStats(1e7)</langsyntaxhighlight>
 
Output for 10 million samples:
Line 2,802:
 
=={{header|M2000 Interpreter}}==
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Enum Strat {Stay, Random, Switch}
Line 2,847:
}
CheckIt
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,856:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica"> montyHall[nGames_] :=
Module[{r, winningDoors, firstChoices, nStayWins, nSwitchWins, s},
r := RandomInteger[{1, 3}, nGames];
Line 2,865:
Grid[{{"Strategy", "Wins", "Win %"}, {"Stay", Row[{nStayWins, "/", nGames}], s=N[100 nStayWins/nGames]},
{"Switch", Row[{nSwitchWins, "/", nGames}], 100 - s}}, Frame -> All]]</langsyntaxhighlight>
 
;Usage:
<syntaxhighlight lang Mathematica="mathematica">montyHall[100000]</langsyntaxhighlight>
 
[[File:MontyHall.jpg]]
 
=={{header|MATLAB}}==
<langsyntaxhighlight MATLABlang="matlab">function montyHall(numDoors,numSimulations)
 
assert(numDoors > 2);
Line 2,928:
disp(sprintf('Switch win percentage: %f%%\nStay win percentage: %f%%\n', [switchedDoors(1)/sum(switchedDoors),stayed(1)/sum(stayed)] * 100));
end</langsyntaxhighlight>
 
Output:
<langsyntaxhighlight MATLABlang="matlab">>> montyHall(3,100000)
Switch win percentage: 66.705972%
Stay win percentage: 33.420062%</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">fn montyHall choice switch =
(
doors = #(false, false, false)
Line 2,960:
iterations = 10000
format ("Stay strategy:%\%\n") (iterate iterations false)
format ("Switch strategy:%\%\n") (iterate iterations true)</langsyntaxhighlight>
Output:
<langsyntaxhighlight lang="maxscript">Stay strategy:33.77%
Switch strategy:66.84%</langsyntaxhighlight>
 
=={{header|NetRexx}}==
Line 2,969:
{{trans|REXX}}
{{trans|PL/I}}
<langsyntaxhighlight lang="netrexx">/* NetRexx ************************************************************
* 30.08.2013 Walter Pachl translated from Java/REXX/PL/I
**********************************************************************/
Line 3,003:
method r3 static
rand=random()
return rand.nextInt(3) + 1</langsyntaxhighlight>
Output
<pre>
Line 3,012:
=={{header|Nim}}==
{{trans|Python}}
<langsyntaxhighlight lang="nim">import random
 
randomize()
Line 3,049:
 
echo "Stay = ",stay
echo "Switch = ",switch</langsyntaxhighlight>
Output:
<pre>Stay = 337
Line 3,055:
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let trials = 10000
 
type door = Car | Goat
Line 3,083:
strat (100. *. (float n /. float trials)) in
msg "switch" switch;
msg "stay" stay</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">test(trials)={
my(stay=0,change=0);
for(i=1,trials,
Line 3,098:
};
 
test(1e4)</langsyntaxhighlight>
 
Output:
Line 3,106:
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program MontyHall;
 
uses
Line 3,156:
 
end.
</syntaxhighlight>
</lang>
 
Output:
Line 3,165:
=={{header|Perl}}==
 
<langsyntaxhighlight lang="perl">#! /usr/bin/perl
use strict;
my $trials = 10000;
Line 3,191:
 
print "Stay win ratio " . (100.0 * $stay/$trials) . "\n";
print "Switch win ratio " . (100.0 * $switch/$trials) . "\n";</langsyntaxhighlight>
 
=={{header|Phix}}==
Modified copy of [[Monty_Hall_problem#Euphoria|Euphoria]]
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">swapWins</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">stayWins</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">winner</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">choice</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">reveal</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">other</span>
Line 3,212:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Stay: %,d\nSwap: %,d\nTime: %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">stayWins</span><span style="color: #0000FF;">,</span><span style="color: #000000;">swapWins</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">elapsed</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span><span style="color: #0000FF;">)})</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,221:
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php"><?php
function montyhall($iterations){
$switch_win = 0;
Line 3,247:
montyhall(10000);
?></langsyntaxhighlight>
Output:
<pre>Iterations: 10000 - Stayed wins: 3331 (33.31%) - Switched wins: 6669 (66.69%)</pre>
 
=={{header|Picat}}==
<langsyntaxhighlight Picatlang="picat">go =>
_ = random2(), % different seed
member(Rounds,[1000,10_000,100_000,1_000_000,10_000_000]),
Line 3,280:
choice(N) = random(1,N).
 
pick(L) = L[random(1,L.len)].</langsyntaxhighlight>
 
{{out}}
Line 3,304:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de montyHall (Keep)
(let (Prize (rand 1 3) Choice (rand 1 3))
(if Keep # Keeping the first choice?
Line 3,322:
(do 10000 (and (montyHall NIL) (inc 'Cnt)))
(format Cnt 2) )
" %" )</langsyntaxhighlight>
Output:
<pre>Strategy KEEP -> 33.01 %
Line 3,329:
=={{header|PL/I}}==
{{trans|Java}}
<langsyntaxhighlight lang="pli">*process source attributes xref;
ziegen: Proc Options(main);
/* REXX ***************************************************************
Line 3,366:
Return(res);
End;
End;</langsyntaxhighlight>
Output:
<pre>
Line 3,376:
Use ghostscript or print this to a postscript printer
 
<syntaxhighlight lang="postscript">%!PS
<lang PostScript>%!PS
/Courier % name the desired font
20 selectfont % choose the size in points and establish
Line 3,411:
 
 
showpage % print all on the page</langsyntaxhighlight>
 
Sample output:
Line 3,420:
 
=={{header|PowerShell}}==
<langsyntaxhighlight Powershelllang="powershell">#Declaring variables
$intIterations = 10000
$intKept = 0
Line 3,473:
Write-Host "Keep : $intKept ($($intKept/$intIterations*100)%)"
Write-Host "Switch: $intSwitched ($($intSwitched/$intIterations*100)%)"
Write-Host ""</langsyntaxhighlight>
Output:
<pre>Results through 10000 iterations:
Line 3,481:
=={{header|Prolog}}==
{{works with|GNU Prolog}}
<syntaxhighlight lang="prolog">
<lang Prolog>
:- initialization(main).
 
Line 3,525:
win_count(1000, false, 0, StayTotal),
format('Staying wins ~d out of 1000.\n', [StayTotal]).
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,533:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Structure wins
stay.i
redecide.i
Line 3,567:
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()</langsyntaxhighlight>
 
Output:<pre>Trial runs for each option: 1000000
Line 3,574:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">'''
I could understand the explanation of the Monty Hall problem
but needed some more evidence
Line 3,618:
print sum(monty_hall(randrange(3), switch=True)
for x in range(iterations)),
print "out of", iterations, "times.\n"</langsyntaxhighlight>
Sample output:
<pre>Monty Hall problem simulation:
Line 3,630:
===Python 3 version: ===
Another (simpler in my opinion), way to do this is below, also in python 3:
<langsyntaxhighlight lang="python">import random
#1 represents a car
#0 represent a goat
Line 3,662:
print("Stay =",stay)
print("Switch = ",switch)
#Done by Sam Witton 09/04/2014</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ $ "bigrat.qky" loadfile ] now!
[ 0 ( number of cars when not changing choice )
Line 3,683:
say "Approximate ratio of car wins with strategy A over strategy B: "
swap 100 round
vulgar$ echo$ cr ] is trials ( n --> )</langsyntaxhighlight>
 
{{out}}
Line 3,708:
=={{header|R}}==
 
<langsyntaxhighlight lang="rsplus">set.seed(19771025) # set the seed to set the same results as this code
N <- 10000 # trials
true_answers <- sample(1:3, N, replace=TRUE)
Line 3,765:
change <- runif(N) >= .5
random_switch[change] <- other_door[change]
summary(random_switch == true_answers)</langsyntaxhighlight>
 
 
Line 3,831:
=={{header|Racket}}==
 
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket
 
Line 3,868:
 
(for-each test-strategy (list keep-choice change-choice))
</syntaxhighlight>
</lang>
 
Sample Output:
Line 3,881:
This implementation is parametric over the number of doors. [[wp:Monty_Hall_problem#Increasing_the_number_of_doors|Increasing the number of doors in play makes the superiority of the switch strategy even more obvious]].
 
<syntaxhighlight lang="raku" perl6line>enum Prize <Car Goat>;
enum Strategy <Stay Switch>;
Line 3,919:
'% of the time.'
}
}</langsyntaxhighlight>
{{out}}
<pre>With 3 doors:
Line 3,931:
===version 1===
{{trans|Java}}
<langsyntaxhighlight lang="rexx">/* REXX ***************************************************************
* 30.08.2013 Walter Pachl derived from Java
**********************************************************************/
Line 3,961:
Say 'NetRexx:' time('E') 'seconds'
Exit
r3: Return random(2)+1</langsyntaxhighlight>
Output for 1000000 samples:
<pre>
Line 3,985:
 
===version 2===
<langsyntaxhighlight lang="rexx">/*REXX program simulates any number of trials of the classic TV show Monty Hall problem.*/
parse arg # seed . /*obtain the optional args from the CL.*/
if #=='' | #=="," then #= 1000000 /*Not specified? Then 1 million trials*/
Line 3,998:
say 'switching wins ' format(wins.0 / # * 100, , 1)"% of the time."
say ' staying wins ' format(wins.1 / # * 100, , 1)"% of the time." ; say
say 'performed ' # " times with 3 doors." /*stick a fork in it, we're all done. */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
Line 4,008:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
total = 10000
swapper = 0
Line 4,031:
see "the 'sticker' won " + sticker + " times (" + floor(sticker/total*100) + "%)" + nl
see "the 'swapper' won " + swapper + " times (" + floor(swapper/total*100) + "%)" + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 4,041:
=={{header|Ruby}}==
 
<langsyntaxhighlight lang="ruby">n = 10_000 #number of times to play
 
stay = switch = 0 #sum of each strategy's wins
Line 4,067:
 
puts "Staying wins %.2f%% of the time." % (100.0 * stay / n)
puts "Switching wins %.2f%% of the time." % (100.0 * switch / n)</langsyntaxhighlight>
Sample Output:
<pre>Staying wins 33.84% of the time.
Line 4,073:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">' adapted from BASIC solution
 
input "Number of tries;";tries ' gimme the number of iterations
Line 4,094:
PRINT " Result for ";tries;" games."
PRINT "Switching wins ";switchWins; " times."
PRINT " Staying wins ";stayWins; " times."</langsyntaxhighlight>
 
=={{header|Rust}}==
{{libheader|rand}}
<langsyntaxhighlight lang="rust">extern crate rand;
use rand::Rng;
use rand::seq::SliceRandom;
Line 4,124:
percent = switch_wins as f64 / GAMES as f64 * 100.0
);
}</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">import scala.util.Random
 
object MontyHallSimulation {
Line 4,159:
switchStrategyWins, percent(switchStrategyWins)))
}
}</langsyntaxhighlight>
 
Sample:
Line 4,170:
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (random-from-list list) (list-ref list (random (length list))))
(define (random-permutation list)
(if (null? list)
Line 4,239:
;; > (compare-strategies 1000000)
;; (stay-strategy won with probability 33.3638 %
;; and switch-strategy won with probability 66.716 %)</langsyntaxhighlight>
 
=={{header|Scilab}}==
{{incorrect|scilab|Several syntax and logical errors: switch is a keyword, the variable a is never used, and in the result the sum does not yield 100000 (which is logical since both result are taken from different random samples, but they should not). Also some useless complexity: the nested if can be simplified with logical operators.}}
 
<syntaxhighlight lang="text">// How it works:
// MontyHall() is a function with argument switch:
// it will be called 100000 times with switch=%T,
Line 4,281:
end
disp("Switching, one wins"+ascii(10)+string(wins_switch)+" games out of "+string(games))
disp("Staying, one wins"+ascii(10)+string(wins_stay)+" games out of "+string(games))</langsyntaxhighlight>
 
Output:
Line 4,294:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: main is func
Line 4,316:
writeln("Switching wins " <& switchWins <& " times");
writeln("Staying wins " <& stayWins <& " times");
end func;</langsyntaxhighlight>
 
Output:
Line 4,325:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var n = 1000 # number of times to play
var switchWins = (var stayWins = 0) # sum of each strategy's wins
 
Line 4,345:
 
say ("Staying wins %.2f%% of the time." % (100.0 * stayWins / n))
say ("Switching wins %.2f%% of the time." % (100.0 * switchWins / n))</langsyntaxhighlight>
{{out}}
<pre>
Line 4,354:
=={{header|SPAD}}==
{{works with|FriCAS, OpenAxiom, Axiom}}
<syntaxhighlight lang="spad">
<lang SPAD>
montyHall(n) ==
wd:=[1+random(3) for j in 1..n]
Line 4,361:
p:=(st/n)::DoubleFloat
FORMAT(nil,"stay: ~A, switch: ~A",p,1-p)$Lisp
</syntaxhighlight>
</lang>
Domain:[http://fricas.github.io/api/Integer.html?highlight=random Integer]
 
Line 4,384:
=={{header|Stata}}==
 
<langsyntaxhighlight lang="stata">clear
set obs 1000000
gen car=runiformint(1,3)
Line 4,393:
gen choice2=6-shown-choice1
gen succ2=car==choice2
tabstat succ1 succ2, s(mean)</langsyntaxhighlight>
 
'''Output'''
Line 4,404:
=={{header|Swift}}==
 
<langsyntaxhighlight lang="swift">import Foundation
 
func montyHall(doors: Int = 3, guess: Int, switch: Bool) -> Bool {
Line 4,426:
 
print("Switching would've won \((Double(switchWins) / Double(switchResults.count)) * 100)% of games")
print("Not switching would've won \(((Double(switchResults.count - switchWins)) / Double(switchResults.count)) * 100)% of games")</langsyntaxhighlight>
 
{{out}}
Line 4,434:
=={{header|Tcl}}==
A simple way of dealing with this one, based on knowledge of the underlying probabilistic system, is to use code like this:
<langsyntaxhighlight lang="tcl">set stay 0; set change 0; set total 10000
for {set i 0} {$i<$total} {incr i} {
if {int(rand()*3) == int(rand()*3)} {
Line 4,443:
}
puts "Estimate: $stay/$total wins for staying strategy"
puts "Estimate: $change/$total wins for changing strategy"</langsyntaxhighlight>
But that's not really the point of this challenge; it should add the concealing factors too so that we're simulating not just the solution to the game, but also the game itself. (Note that we are using Tcl's lists here to simulate sets.)
 
We include a third strategy that is proposed by some people (who haven't thought much about it) for this game: just picking at random between all the doors offered by Monty the second time round.
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
# Utility: pick a random item from a list
Line 4,512:
puts "Estimate: $stay/$total wins for 'staying' strategy"
puts "Estimate: $change/$total wins for 'changing' strategy"
puts "Estimate: $anew/$total wins for 'picking anew' strategy"</langsyntaxhighlight>
This might then produce output like
Estimate: 3340/10000 wins for 'staying' strategy
Line 4,521:
=={{header|Transact SQL}}==
T-SQL for general case:
<syntaxhighlight lang="transact sql">
<lang Transact SQL>
---- BEGIN ------------
create table MONTY_HALL(
Line 4,563:
from MONTY_HALL
---- END ------------
</syntaxhighlight>
</lang>
<pre>
% OF WINS FOR KEEP % OF WINS FOR CHANGE % OF WINS FOR RANDOM
Line 4,572:
=={{header|UNIX Shell}}==
{{works with|bash|2.x| and most bash-compatible unix shells}}
<langsyntaxhighlight lang="bash">#!/bin/bash
# Simulates the "monty hall" probability paradox and shows results.
# http://en.wikipedia.org/wiki/Monty_Hall_problem
Line 4,643:
echo "Wins (switch to remaining door): $num_win"
echo "Losses (first guess was correct): $num_lose"
exit 0</langsyntaxhighlight>
Output of a few runs:
<pre>
Line 4,697:
for the switching strategy.
 
<langsyntaxhighlight Ursalalang="ursala">#import std
#import nat
#import flo
Line 4,713:
#show+
 
main = ~&plrTS/<'stay: ','switch: '> format* <staying_wins,switching_wins></langsyntaxhighlight>
Output will vary slightly for each run due to randomness.
<pre>
Line 4,724:
 
Vedit macro language does not have random number generator, so one is implemented in subroutine RANDOM (the algorithm was taken from ANSI C library).
<langsyntaxhighlight lang="vedit">#90 = Time_Tick // seed for random number generator
#91 = 3 // random numbers in range 0 to 2
#1 = 0 // wins for "always stay" strategy
Line 4,757:
#93 = 0x7fffffff % 48271
#90 = (48271 * (#90 % #92) - #93 * (#90 / #92)) & 0x7fffffff
return ((#90 & 0xffff) * #91 / 0x10000)</langsyntaxhighlight>
 
Sample output:
Line 4,767:
=={{header|Wren}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="ecmascript">import "random" for Random
 
var montyHall = Fn.new { |games|
Line 4,790:
}
 
montyHall.call(1e6)</langsyntaxhighlight>
 
{{out}}
Line 4,801:
 
=={{header|X++}}==
<langsyntaxhighlight lang="x++">//Evidence of the Monty Hall solution in Dynamics AX (by Wessel du Plooy - HiGH Software).
 
int changeWins = 0;
Line 4,834:
print strFmt("Staying wins %1 times.", noChangeWins);
pause;
</syntaxhighlight>
</lang>
 
Output:
Line 4,841:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">def Games = 10000; \number of games simulated
int Game, Wins;
include c:\cxpl\codes;
Line 4,871:
RlOut(0, float(Wins)/float(Games)*100.0);
Text(0, "% of games.^M^J");
]</langsyntaxhighlight>
 
Example output:
Line 4,881:
 
=={{header|Yabasic}}==
<langsyntaxhighlight lang="yabasic">
numTiradas = 1000000
 
Line 4,903:
print "Si cambia, tiene un ", cambia / numTiradas * 100, "% de probabilidades de ganar."
end
</syntaxhighlight>
</lang>
 
 
=={{header|zkl}}==
{{trans|Go}}
<langsyntaxhighlight lang="zkl">const games=0d100_000;
 
reg switcherWins=0, keeperWins=0, shown=0;
Line 4,924:
switcherWins, switcherWins.toFloat() / games * 100).println();
"Keeper Wins: %,d (%3.2f%%)".fmt(
keeperWins, keeperWins.toFloat() / games * 100).println();</langsyntaxhighlight>
{{out}}
<pre>
10,339

edits