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.