Есть такая занятная дурь -
парадокс Монти Холла. Повторять статью из Википедии не буду, расскажу лучше про приколы с восприятием. Программисты - народ тёмный, недоверчивый, «пока не пощупаю - не поверю», и для проверки этого парадокса пишут небольшие программы.
#!/usr/bin/perl
$hit=0;
$loopc=100000;
$rand_loc_auto=0;
$rand_loc_choise=0;
for ($loop=0; $loop<$loopc; $loop++) {
# Making a choise
$loc_auto=mkrand(3); $rand_loc_auto[$loc_auto]++; # Automobile
$loc_choise=mkrand(3); $rand_loc_choise[$loc_choise]++; # Player's choise
# Automobile chosen from start
if ($loc_choise==$loc_auto) {
$loc_open=mkrand(2);
if ($loc_auto==0) { $loc_open++; }
if ($loc_auto==1) { if ($loc_open==1) { $loc_open++; } }
} else {
# Goat was chosen
$loc_open=0;
if ($loc_open==$loc_auto) { $loc_open++; }
if ($loc_open==$loc_chose) { $loc_open++; }
}
# $loc_open - number of opened door
## Variant 1 - choise at is was
# $loc_final=$loc_choise;
# Variant 2 - choise of the other door
$loc_final=0; # final user choise
if ($loc_final==$loc_choise) { $loc_final++; }
if ($loc_final==$loc_open) { $loc_final++; }
# print "A:$loc_auto C:$loc_choise O:$loc_open F:$loc_final\n";
if ($loc_final==$loc_auto) { $hit++; }
}
$v=sprintf("%3.3f", $hit/$loopc);
print "Hit: $hit / $loopc = $v\n";
print "LA: $rand_loc_auto[0] $rand_loc_auto[1] $rand_loc_auto[2]\n";
print "LC: $rand_loc_choise[0] $rand_loc_choise[1] $rand_loc_choise[2]\n";
sub mkrand {
local($base)=@_[0];
local($rv);
$rv=int(rand($base));
return $rv;
}
";
echo "Стратегия: всегда менять выбор, выигрыш = $выигрыш_2
";
show_source(__FILE__);
?>
#!/usr/bin/ruby
CASES_COUNT = 1_000_000
class Array
def random
return self[rand(self.size)]
end
end
def perform_test(change_selection)
hits = 0
misses = 0
doors = [:car, :goat, :goat]
CASES_COUNT.times do
doors.shuffle!
car_door = doors.index(:car)
user_choice = rand(3)
goat_door = ([0, 1, 2]-[car_door, user_choice]).random
user_choice = ([0, 1, 2]-[user_choice, goat_door]).first if change_selection
case doors[user_choice]
when :car then hits += 1
when :goat then misses += 1
end
end
return [hits, misses]
end
hits, misses = perform_test(false)
puts "Hits: #{hits}; Misses: #{misses}"
puts "WinRate: #{hits.to_f/CASES_COUNT}"
hits, misses = perform_test(true)
puts "Hits: #{hits}; Misses: #{misses}"
puts "WinRate: #{hits.to_f/CASES_COUNT}"
zmeuka: «Ситуация сильно напоминает тест на понимание ТЗ»