Monty Hall problem: Difference between revisions

Content added Content deleted
m (→‎{{header|ANSI BASIC}}: Level of header lowered.)
m (→‎{{header|ANSI BASIC}}: Set line numbers.)
Line 546: Line 546:
{{works with|Decimal BASIC}}
{{works with|Decimal BASIC}}
<syntaxhighlight lang="basic">
<syntaxhighlight lang="basic">
PROGRAM MontyHallProblem
100 PROGRAM MontyHallProblem
DEF NGames = 10000
110 DEF NGames = 10000
RANDOMIZE
120 RANDOMIZE
LET NWins = 0
130 LET NWins = 0
FOR Game = 0 TO NGames
140 FOR Game = 0 TO NGames
IF IsGameWon(0) <> 0 THEN LET NWins = NWins + 1
150 IF IsGameWon(0) <> 0 THEN LET NWins = NWins + 1
NEXT Game
160 NEXT Game
PRINT "NOT switching doors wins car in ";
170 PRINT "NOT switching doors wins car in ";
PRINT USING "##.#": NWins / NGames * 100;
180 PRINT USING "##.#": NWins / NGames * 100;
PRINT "% of games."
190 PRINT "% of games."
LET NWins = 0
200 LET NWins = 0
FOR Game = 0 TO NGames
210 FOR Game = 0 TO NGames
IF IsGameWon(1) <> 0 THEN LET NWins = NWins + 1
220 IF IsGameWon(1) <> 0 THEN LET NWins = NWins + 1
NEXT Game
230 NEXT Game
PRINT "But switching doors wins car in ";
240 PRINT "But switching doors wins car in ";
PRINT USING "##.#": NWins / NGames * 100;
250 PRINT USING "##.#": NWins / NGames * 100;
PRINT "% of games."
260 PRINT "% of games."
END
270 END
REM ***
280 REM ***
EXTERNAL FUNCTION IsGameWon(Sw)
290 EXTERNAL FUNCTION IsGameWon(Sw)
REM Play one game.
300 REM Play one game.
REM Switching if and only if Sw <> 0.
310 REM Switching if and only if Sw <> 0.
REM Returns 1 if the game is won, 0 otherwise.
320 REM Returns 1 if the game is won, 0 otherwise.
LET Car = INT(RND * 3) ! Randomly place car behind a door.
330 LET Car = INT(RND * 3) ! Randomly place car behind a door.
LET Player0 = INT(RND * 3) ! Player randomly chooses a door.
340 LET Player0 = INT(RND * 3) ! Player randomly chooses a door.
DO
350 DO
LET Monty = INT(RND * 3) ! Monty opens door revealing a goat.
360 LET Monty = INT(RND * 3) ! Monty opens door revealing a goat.
LOOP UNTIL (Monty <> Car) AND (Monty <> Player0)
370 LOOP UNTIL (Monty <> Car) AND (Monty <> Player0)
IF Sw <> 0 THEN ! Player switches TO remaining door.
380 IF Sw <> 0 THEN ! Player switches TO remaining door.
DO
390 DO
LET Player = INT(RND * 3)
400 LET Player = INT(RND * 3)
LOOP UNTIL (Player <> Player0) AND (Player <> Monty)
410 LOOP UNTIL (Player <> Player0) AND (Player <> Monty)
ELSE
420 ELSE
LET Player = Player0 ! Player sticks with original door.
430 LET Player = Player0 ! Player sticks with original door.
END IF
440 END IF
IF Player = Car THEN
450 IF Player = Car THEN
LET IsGameWon = 1
460 LET IsGameWon = 1
ELSE
470 ELSE
LET IsGameWon = 0
480 LET IsGameWon = 0
END IF
490 END IF
END FUNCTION
500 END FUNCTION

</syntaxhighlight>
</syntaxhighlight>
{{out}}(example)
{{out}}(example)