function [swithcWinPercentage,stayWinPercentage] = montyHall(numDoors,numSimulations) % Reference: http://rosettacode.org/wiki/Monty_Hall_problem assert(numDoors > 2); function num = randInt(n) num = floor( n*rand()+1 ); end %The first column will tallie wins, the second losses switchedDoors = [0 0]; stayed = [0 0]; for i = (1:numSimulations) availableDoors = (1:numDoors); %Preallocate the available doors winningDoor = randInt(numDoors); %Define the winning door playersOriginalChoice = randInt(numDoors); %The player picks his initial choice availableDoors(playersOriginalChoice) = []; %Remove the players choice from the available doors %Pick the door to open from the available doors openDoor = availableDoors(randperm(numel(availableDoors))); %Sort the available doors randomly openDoor(openDoor == winningDoor) = []; %Make sure Monty doesn't open the winning door openDoor = openDoor(randInt(numel(openDoor))); %Choose a random door to open availableDoors(availableDoors==openDoor) = []; %Remove the open door from the available doors availableDoors(end+1) = playersOriginalChoice; %Put the player's original choice back into the pool of available doors availableDoors = sort(availableDoors); playersNewChoice = availableDoors(randInt(numel(availableDoors))); %Pick one of the available doors if playersNewChoice == playersOriginalChoice switch playersNewChoice == winningDoor case true stayed(1) = stayed(1) + 1; case false stayed(2) = stayed(2) + 1; otherwise error 'ERROR' end else switch playersNewChoice == winningDoor case true switchedDoors(1) = switchedDoors(1) + 1; case false switchedDoors(2) = switchedDoors(2) + 1; otherwise error 'ERROR' end end end disp(sprintf('Switch win percentage: %f%%\nStay win percentage: %f%%\n', [switchedDoors(1)/sum(switchedDoors),stayed(1)/sum(stayed)] * 100)); swithcWinPercentage = switchedDoors(1)/sum(switchedDoors); stayWinPercentage = stayed(1)/sum(stayed); end