(no subject)

Oct 29, 2008 01:14

Есть такая занятная дурь - парадокс Монти Холла. Повторять статью из Википедии не буду, расскажу лучше про приколы с восприятием. Программисты - народ тёмный, недоверчивый, «пока не пощупаю - не поверю», и для проверки этого парадокса пишут небольшие программы.



#!/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: «Ситуация сильно напоминает тест на понимание ТЗ»

q-revo

Previous post Next post
Up