(no subject)

Wednesday, October 29th, 2008 01:14
kastaneda: (Default)
[personal profile] kastaneda
Есть такая занятная дурь — парадокс Монти Холла. Повторять статью из Википедии не буду, расскажу лучше про приколы с восприятием. Программисты — народ тёмный, недоверчивый, «пока не пощупаю — не поверю», и для проверки этого парадокса пишут небольшие программы.


#!/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;
}



<?php

// http://ru.wikipedia.org/wiki/Парадокс_Монти_Холла

mt_srand();
$выигрыш_1 = $выигрыш_2 = 0;

for( $итерация=0; $итерация<10000; $итерация++ ) {
    $дверь_с_призом = mt_rand(1,3);
    $первый_выбор_игорка = mt_rand(1,3);
    $дверь_открытая_ведущим = $второй_выбор_игрока = -1;

    // первая стратегия
    if( $дверь_с_призом==$первый_выбор_игорка ) $выигрыш_1++;

    // вторая стратегия
    for( $дверь=1; $дверь<=3; $дверь++ )
        if( $дверь!=$дверь_с_призом && $дверь!=$первый_выбор_игорка )
            $дверь_открытая_ведущим = $дверь;

    for( $дверь=1; $дверь<=3; $дверь++ )
        if( $дверь!=$первый_выбор_игорка && $дверь!=$дверь_открытая_ведущим )
            $второй_выбор_игрока = $дверь;

    if( $дверь_с_призом==$второй_выбор_игрока ) $выигрыш_2++;
}

echo "Стратегия: никогда не менять выбор, выигрыш = $выигрыш_1<br>";
echo "Стратегия: всегда менять выбор, выигрыш = $выигрыш_2<br>";
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}"



[livejournal.com profile] zmeuka: «Ситуация сильно напоминает тест на понимание ТЗ»

Date: Wednesday, October 29th, 2008 12:44 am (UTC)
From: [identity profile] bubukec.livejournal.com
Еще ActionScript в копилку... Да, народ мы темный и недоверчивый. Таки тоже начал писать... получилась самая короткая версия :)))

trace ("Probability to win when door stays the same:"+Number (1/3));
trace ("Probability to win when door changed:"+Number (2/3));

а начинал, а начинал то :)))

function rnd ():Number { return Math.floor(Math.random ()*3); }

var i_change:Number = 0;
var i_dont:Number = 0;
var i,car,guess,goat:Number;

for (i=0;i<1000000;i++)
{
car = rnd ();
guess = rnd ();

goat = (car+1)%3; // а от этих двух строчек ничего и не зависит...
if (goat==guess) goat = (car+2)%3;

if (car==guess) i_dont++;
else i_change++;
}
trace ("Win when changed : "+i_change);
trace ("Win when stayed : "+i_dont);

Date: Wednesday, October 29th, 2008 05:22 am (UTC)
From: [identity profile] zuhunter.livejournal.com
ссылка кривая

Моё малость битое.

Date: Wednesday, October 29th, 2008 09:07 am (UTC)

Date: Wednesday, October 29th, 2008 10:21 am (UTC)
From: [identity profile] newtricker.livejournal.com
Про вирус парадокса Монти Холла здесь кое-что :)

http://newtricker.livejournal.com/63200.html

Date: Wednesday, October 29th, 2008 09:19 pm (UTC)
From: [identity profile] neithere.livejournal.com
я когда-то тоже писал :)

Date: Sunday, December 28th, 2008 08:06 am (UTC)
From: [identity profile] alexyecu.livejournal.com
Я вот это накатал
http://swfmaster.ru/test/3doors.html
в ответ на
http://object.livejournal.com/?skip=40
(там в середине страницы две темы с примерами народного творчества).

Date: Tuesday, August 31st, 2010 04:35 pm (UTC)
From: [identity profile] vadim-kataev.livejournal.com
питон, для полноты картины: http://vadim-kataev.livejournal.com/214444.html

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930