Updated 2017-06-22 20:38:44 by RKzn

Arjen Markus (21 june 2017) Here is a small program to simulate the so-called Monty Hall problem, one of those fascinating counter-intuitive results in statistics and probabilistics. While it is not really difficult to describe the set-up, simulating it turned out to be a trifle tricky. But the outcome is in agreement with the theoretical results.

Note: it could be done in fewer lines as well.
```# threedoors.tcl --
#     Simulate a classical game show problem:
#     - Three doors are shown, one gives access to the prize
#     - You chose a door
#     - The game show host shows that one of the other doors
#       does NOT contain the prize and asks you if you want
#       to change your mind
#
#     The statistically correct answer is: you should change your
#     mind. It is counter-intuitive though that this should matter.
#
#     This is a demonstration of the situation.
#

set trials        10000
#set trials        3
set otherDoorWins 0
set firstDoorWins 0

for {set i 0} {\$i < \$trials} {incr i} {
# Determine the winning door
set winning [expr {int(3 * rand())}]

# Select a door
set selected [expr {int(3 * rand())}]

# Now exclude a non-winning door
set excludables {}
foreach door {0 1 2} {
if { \$door != \$selected } {
lappend excludables \$door
}
}

#puts "Selected:  \$selected"
#puts "Winning:   \$winning"
#puts "Excluding: \$excludables"

set excludedIndex [expr {int(2 * rand())}]
if { [lindex \$excludables \$excludedIndex] == \$winning } {
set excludedIndex [expr {1 - \$excludedIndex}]
}

set remaining [lindex \$excludables [expr {1 - \$excludedIndex}]]

#puts "Remaining: \$remaining"

# Check if we have won the prize or if the remaining door is the one
if { \$winning == \$remaining } {
incr otherDoorWins
}
if { \$winning == \$selected } {
incr firstDoorWins
}
}

puts "Total number of trials: \$trials"
puts "First door wins:        \$firstDoorWins - [expr {\$firstDoorWins/double(\$trials)}]"
puts "Other door wins:        \$otherDoorWins - [expr {\$otherDoorWins/double(\$trials)}]"
```