Geresnis pasirinkimas...

Kuklūs bandymai atsakyti į amžinus klausimus laikiname pasaulyje.
Šešėlis
senbuvis
Posts: 1127
Joined: 2007-08-01 21:58

2010-10-02 22:48

Šaunuolis, kad nepasivarginai ištirti reikalą moksliškai
Turėjau kelias minutes laisvo laiko, siūlau patį moksliškiausią įmanomą sprendimą Pascal kalba (tingiu perrašinėt kokiai populiaresnei):

program Ožkos;
var laimingosdurys, {laimingų durų numeris: gali būti nuo 1 iki 3}
spėjimas, {spėjamų durų numeris: gali būti nuo 1 iki 3}
atidaromosdurys : integer; {vedėjo atidaromų durų numeris: gali būti nuo 1 iki 3}
atspėta, {kiek kartų atspėta}
kartojimai : longint; {kiek kartų kartoti ciklą}
procentinėdalis : real; {eksperimento rezultatas, išreikštas procentais}
begin
Randomize;
atspėta := 0;
kartojimai := 0;
repeat begin
laimingosdurys := Random(3)+1; {gali būti bet kurios iš 3}
spėjimas := Random(3)+1;
atidaromosdurys := Random(3)+1;
while (atidaromosdurys = laimingosdurys) or (atidaromosdurys = spėjimas) do {užtikrinama, kad nesutaptų su ankstesniais kintamaisiais}
atidaromosdurys := Random(3)+1;
if ((spėjimas = 1) and (atidaromosdurys = 2)) or ((spėjimas = 2) and (atidaromosdurys = 1)) then {imituojamas durų pasirinkimo keitimas}
spėjimas := 3 else
if ((spėjimas = 2) and (atidaromosdurys = 3)) or ((spėjimas = 3) and (atidaromosdurys = 2)) then
spėjimas := 1 else
if ((spėjimas = 1) and (atidaromosdurys = 3)) or ((spėjimas = 3) and (atidaromosdurys = 1)) then
spėjimas := 2;
if spėjimas = laimingosdurys then
Inc(atspėta); {atspėjus padidinti vienetu}
Inc(kartojimai)
end;
until kartojimai = 100000; {galima įrašyti bet kokį sveikąjį skaičių}
procentinėdalis := atspėta/kartojimai*100;
WriteLn(Trunc(procentinėdalis), ' % spėjimų buvo sėkmingi');
WriteLn('Spauskite Enter');
Readln
end.


Mano rezultatai svyruoja nuo 66 iki 67 proc. Dar toks įdomus dalykas: nuėmus „else“ operatorius, rezultatas ima svyruoti apie 50 proc.
User avatar
insurrectum
pradedantis
Posts: 493
Joined: 2006-09-28 15:01

2010-10-05 01:36

Šešėlis wrote: Turėjau kelias minutes laisvo laiko, siūlau patį moksliškiausią įmanomą sprendimą Pascal kalba (tingiu perrašinėt kokiai populiaresnei):
Oho koks populiarus užsiemimas, va mano sena kreatura Matlabui:

Code: Select all

function Ozkos ()
    statsCoiseA = zeros (1000);
    statsCoiseB = zeros (1000);
    sumWinA=0;
    sumWinB=0;
    
    for t=1:10000
       doors = randperm(3); %1,2 - ozkos, 3-automobilis
       playerChoiseA = randi(3);
       playerChoiseB = 0;
       showmanChoise = 0;

       for n=1:3
          if n ~= playerChoiseA && 3~= doors(n)
              if 3 == doors (playerChoiseA) && 0 == showmanChoise && 0.5 > rand(1)
                  showmanChoise = n;
                  continue;
              else
                  showmanChoise = n;
                  break;
              end
          end
       end
       
       for n=1:3
         if n ~= playerChoiseA && n~= showmanChoise
             playerChoiseB = n;
             break;
         end
       end

       sumWinA = sumWinA + (3 == doors (playerChoiseA));
       sumWinB = sumWinB + (3 == doors (playerChoiseB));
       if 0 == mod (t, 10) 
            statsCoiseA(t/10) = sumWinA/t;
            statsCoiseB(t/10) = sumWinB/t;
       end;
    end
    
    x=1:10:10000;
    plot (x,statsCoiseA,'b-',...
          x,statsCoiseB,'r-'); 
    xlabel (strcat('choiseA=',  num2str(statsCoiseA(1000)), '; choiseB=',  num2str(statsCoiseB(1000))));
end
Svetimas wrote:2. Tikimybinis modelis, kai vedėjas žino, kas yra už durų.
Kažkur yra klaida. Modelis paprastas:

Code: Select all

                   --> 1/2 ožka
    1/3 auto   --|
                   --> 1/2 ožka
    1/3 ožka  -----> 1   auto
    1/3 ožka  -----> 1   auto
Teorinė automobilio tikimybe keičiant duris = (1/3)*1 + (1/3)*1 = 2/3 = 0.66666. Visiškai sutampa su mano ir Šešėlio eksperimentais.
Attachments
ozkos.png
User avatar
Svetimas
senbuvis
Posts: 4692
Joined: 2004-05-25 19:04
Location: Vilnius

2010-10-05 20:36

insurrectum wrote:
Svetimas wrote:2. Tikimybinis modelis, kai vedėjas žino, kas yra už durų.
Kažkur yra klaida. Modelis paprastas:

Code: Select all

                   --> 1/2 ožka
    1/3 auto   --|
                   --> 1/2 ožka
    1/3 ožka  -----> 1   auto
    1/3 ožka  -----> 1   auto
Teorinė automobilio tikimybe keičiant duris = (1/3)*1 + (1/3)*1 = 2/3 = 0.66666. Visiškai sutampa su mano ir Šešėlio eksperimentais.
Deja, klaidos nėra. Ir pagal manąjį modelį automobilio tikimybė keičiant duris = 2/3, o nekeičiant durų = 1/3.
O vat tavo modelio pacituotam fragmente nesupratau. Ką kokią prasmę jame turi kairė ir dešinė pusės?
User avatar
insurrectum
pradedantis
Posts: 493
Joined: 2006-09-28 15:01

2010-10-05 22:10

Svetimas wrote: Deja, klaidos nėra. Ir pagal manąjį modelį automobilio tikimybė keičiant duris = 2/3, o nekeičiant durų = 1/3.
Sorry, neįskaičiau, labai jau painiai užrašei... :oops:
Svetimas wrote: O vat tavo modelio pacituotam fragmente nesupratau. Ką kokią prasmę jame turi kairė ir dešinė pusės?
Įprastas tikimybių medžio diagrama, visos įmanomos įvykių permutacijos. Pasilikti prie pirmų durų atitinka kairė pusę, keisti duris - dešinę (tikimybės dauginamos einant medžiu iki pradžios, gaunama šakos tikimybė. Šakos, kurios atitinką kriterijų (šiuo atveju paprastas TAIP/NE) sumuojamos.

Apie tikimybių medžius gali kad ir šitam vadovėly paskaityt : http://www.dartmouth.edu/~chance/teachi ... ok.mac.pdf
Post Reply