[Arjen Markus] (21 june 2017) Here is a small program to simulate the so-called [http://mathworld.wolfram.com/MontyHallProblem.html%|%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 give 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)}]" ====== <>Category Statistics