58 lines
1.4 KiB
Text
58 lines
1.4 KiB
Text
MODULE MontyHallProblem;
|
|
|
|
FROM STextIO IMPORT
|
|
WriteLn, WriteString;
|
|
FROM RandomNumbers IMPORT
|
|
Randomize, Rnd;
|
|
FROM SRealIO IMPORT
|
|
WriteFixed;
|
|
|
|
CONST
|
|
NGames = 10000; (* number of games simulated *)
|
|
VAR
|
|
NWins, Game: CARDINAL;
|
|
|
|
PROCEDURE IsGameWon(Sw: BOOLEAN): BOOLEAN;
|
|
(* Play one game. *)
|
|
VAR
|
|
Car, Player, Player0, Monty: CARDINAL;
|
|
BEGIN
|
|
Car := Rnd(3); (* Randomly place car behind a door. *)
|
|
Player0 := Rnd(3); (* Player randomly chooses a door. *)
|
|
REPEAT
|
|
Monty := Rnd(3); (* Monty opens door revealing a goat. *)
|
|
UNTIL (Monty <> Car) AND (Monty <> Player0);
|
|
IF Sw THEN
|
|
(* Player switches to remaining door. *)
|
|
REPEAT
|
|
Player := Rnd(3);
|
|
UNTIL (Player <> Player0) AND (Player <> Monty)
|
|
ELSE
|
|
Player := Player0 (* Player sticks with original door. *)
|
|
END;
|
|
RETURN (Player = Car);
|
|
END IsGameWon;
|
|
|
|
BEGIN
|
|
Randomize(0);
|
|
NWins := 0;
|
|
FOR Game := 1 TO NGames DO
|
|
IF IsGameWon(FALSE) THEN
|
|
NWins := NWins + 1
|
|
END
|
|
END;
|
|
WriteString('NOT switching doors wins car in ');
|
|
WriteFixed(FLOAT(NWins) / FLOAT(NGames) * 100.0, 1, 4);
|
|
WriteString('% of games.');
|
|
WriteLn;
|
|
NWins := 0;
|
|
FOR Game := 1 TO NGames DO
|
|
IF IsGameWon(TRUE) THEN
|
|
NWins := NWins + 1
|
|
END
|
|
END;
|
|
WriteString('But switching doors wins car in ');
|
|
WriteFixed(FLOAT(NWins) / FLOAT(NGames) * 100.0, 1, 4);
|
|
WriteString('% of games.');
|
|
WriteLn;
|
|
END MontyHallProblem.
|