-
-
Save kristopolous/3703293 to your computer and use it in GitHub Desktop.
#!/usr/bin/ruby | |
$door_count = 3 | |
$door_list = 0.upto($door_count - 1).to_a | |
$game_count = 10 * 1000 | |
def percent(numerator, denominator) | |
return "%5.2f%" %[100 * numerator.to_f / denominator.to_f] | |
end | |
puts "Door Count: #{$door_count}" | |
def coin_monty | |
puts "Coin Flip simulation: There may be 0-#{$door_count} goats or prizes. We flip a 2 sided coin to determine it." | |
switch_win = 0 | |
stay_win = 0 | |
$game_count.times { | |
prizeList = [] | |
# We toss a coin and then add a prize to the door | |
# if the coin is heads (1) | |
0.upto($door_count - 1) { | door | | |
prizeList << door if rand(2) == 1 | |
} | |
# You pick a random dooor. | |
start = rand($door_count) | |
doors = $door_list | |
# Monty dismisses a losing door. | |
if (doors - prizeList).length > 0 | |
dismiss = (doors - (prizeList + [start])).choice | |
else | |
# or a winning door if there are no losing doors. | |
dismiss = (doors - [start]).choice | |
end | |
doors -= [start, dismiss] | |
# The door you switch to will be the one that | |
# wasn't dismissed and that wasn't the one that | |
# you started with. | |
switch = doors.first | |
# If you switched. | |
switch_win += 1 unless prizeList.index(switch).nil? | |
# puts "(%s) %s" %[prizeList.join(', '), start.to_s] | |
# If you stayed. | |
stay_win += 1 unless prizeList.index(start).nil? | |
} | |
puts "After #{$game_count} games:" | |
puts "%28s %s" %[ "switching won the prize:", percent(switch_win, $game_count)] | |
puts "%28s %s" %[ "staying won the prize:", percent(stay_win, $game_count)] | |
puts "" | |
end | |
def rude_monty | |
puts "Rude Monty simulation: Monty will never pick the prize but may pick your door, in which you move over your initial door choice." | |
switch_win = 0 | |
stay_win = 0 | |
$game_count.times { | |
# Prize is behind a random door. | |
prize = rand($door_count) | |
# You pick a random dooor. | |
start = rand($door_count) | |
doors = $door_list | |
# Monty dismisses a losing door. | |
dismiss = (doors - [prize]).choice | |
# If that was my door, I have to switch | |
if dismiss == start | |
start = (doors - [dismiss]).choice | |
end | |
doors -= [start, dismiss] | |
# The door you switch to will be the one that | |
# wasn't dismissed and that wasn't the one that | |
# you started with. | |
switch = doors.first | |
# If you switched. | |
switch_win += 1 if switch == prize | |
# If you stayed. | |
stay_win += 1 if start == prize | |
} | |
puts "After #{$game_count} games:" | |
puts "%28s %s" %[ "switching won the prize:", percent(switch_win, $game_count)] | |
puts "%28s %s" %[ "staying won the prize:", percent(stay_win, $game_count)] | |
puts "" | |
end | |
def smart_monty | |
puts "Smart Monty simulation: Monty will never pick the prize." | |
switch_win = 0 | |
stay_win = 0 | |
$game_count.times { | |
# Prize is behind a random door. | |
prize = rand($door_count) | |
# You pick a random dooor. | |
start = rand($door_count) | |
doors = $door_list | |
# Monty dismisses a losing door. | |
dismiss = (doors - [start, prize]).choice | |
doors -= [start, dismiss] | |
# The door you switch to will be the one that | |
# wasn't dismissed and that wasn't the one that | |
# you started with. | |
switch = doors.first | |
# If you switched. | |
switch_win += 1 if switch == prize | |
# If you stayed. | |
stay_win += 1 if start == prize | |
} | |
puts "After #{$game_count} games:" | |
puts "%28s %s" %[ "switching won the prize:", percent(switch_win, $game_count)] | |
puts "%28s %s" %[ "staying won the prize:", percent(stay_win, $game_count)] | |
puts "" | |
end | |
def dumb_monty | |
puts "Dumb Monty simulation: Monty may pick the prize." | |
switch_win = 0 | |
stay_win = 0 | |
loss_count = 0 | |
played_on_count = 0 | |
$game_count.times { | |
# Prize is behind a random door. | |
prize = rand($door_count) | |
# You pick a random dooor. | |
start = rand($door_count) | |
# Monty dismisses a random door, which may have the prize. | |
dismiss = ($door_list - [start]).choice | |
# If it had the prize, then you lose. | |
if (dismiss == prize) | |
loss_count += 1 | |
else | |
# Otherwise, we continue. | |
played_on_count += 1 | |
# The door you switch to will be the one that | |
# wasn't dismissed and that wasn't the one that | |
# you started with. | |
switch = ($door_list - [start, dismiss]).first | |
# If you switched. | |
switch_win += 1 if switch == prize | |
# If you stayed. | |
stay_win += 1 if start == prize | |
end | |
} | |
puts "After #{$game_count} games:" | |
puts " You lost, because Monty picked the prize: #{percent(loss_count, $game_count)}" | |
puts "" | |
puts "%28s %s" %[ "switching won the prize:", percent(switch_win, played_on_count)] | |
puts "%28s %s" %[ "including times lost:", percent(switch_win, $game_count)] | |
puts "" | |
puts "%28s %s" %[ "staying won the prize:", percent(stay_win, played_on_count)] | |
puts "%28s %s" %[ "including times lost:", percent(stay_win, $game_count)] | |
puts "" | |
end | |
smart_monty | |
rude_monty | |
dumb_monty | |
coin_monty |
Smart Monty simulation: Monty will never pick the prize.
After 100000 games:
switching won the prize: 66.57%
staying won the prize: 33.43%
Dumb Monty simulation: Monty may pick the prize.
After 100000 games:
Monty picked the prize: 33.52%
switching won the prize: 50.16%
including times lost: 33.35%
staying won the prize: 49.84%
including times lost: 33.13%
Door Count: 3
Smart Monty simulation: Monty will never pick the prize.
After 10000 games:
switching won the prize: 67.74%
staying won the prize: 32.26%
Rude Monty simulation: Monty will never pick the prize but may pick your door, in which you move over your initial door choice.
After 10000 games:
switching won the prize: 50.15%
staying won the prize: 49.85%
Dumb Monty simulation: Monty may pick the prize.
After 10000 games:
Monty picked the prize: 32.69%
switching won the prize: 50.20%
including times lost: 33.79%
staying won the prize: 49.80%
including times lost: 33.52%
Coin Flip simulation: There may be 0-3 goats or prizes. We flip a 2 sided coin to determine it.
After 10000 games:
switching won the prize: 75.25%
staying won the prize: 49.94%
Smart Monty simulation: Monty will never pick the prize.
After 100000 games:
staying won the prize: 33.43%
Dumb Monty simulation: Monty may pick the prize.
After 100000 games:
Monty picked the prize: 33.52%