Все още ли имаме сделка?

Сподели тази публикация:

Създаде се разгорещена дискусия по задачката от вчера.
Чувах супер убедителни аргументи и не чак толкова убедителни такива, самият аз си променях мнението 10-тина пъти… И в крайна сметка така не се разбра шансът за печалба при смяна 50% ли е или 66.67%… Което и да е от двете, ясно е, че трябва да имаме сделка, което беше въпросът…
Във форума на ФМИ-Пловдив също се заформиха два лагера – на 50-ците и на 66-ците 🙂 Получих и лични нападки как не ме е срам да пиша глупости, като съм завършил Факултет по математика и информатика и т. н.
В крайна сметка аз съм завършил информатика, обичам програмирането и правя показателство, а не доказателство…
Написах следната програмка, симулираща ситуацията (на любимия си стар Паскал):
const Big_Award=1;
var Player_Box, Remaining_Box, Chosen_Box:byte;
    keep, change:longint;
    i:longint;
begin
  randomize;
  keep:=0;
  change:=0;
  for i:=1 to 100000 do
    begin
      Player_Box:=random(3)+1;
      repeat
        Chosen_Box:=random(3)+1;
      until (Chosen_Box<>Player_Box) and (Chosen_Box<>Big_Award);
      if (Player_Box=1) and (Chosen_Box=2) then Remaining_Box:=3;
      if (Player_Box=1) and (Chosen_Box=3) then Remaining_Box:=2;
      if (Player_Box=2) and (Chosen_Box=1) then Remaining_Box:=3; {never happens}
      if (Player_Box=2) and (Chosen_Box=3) then Remaining_Box:=1;
      if (Player_Box=3) and (Chosen_Box=1) then Remaining_Box:=2; {never happens}
      if (Player_Box=3) and (Chosen_Box=2) then Remaining_Box:=1;
      if Player_Box=Big_Award then inc(keep);
      if Remaining_Box=Big_Award then inc(change);
    end;
  writeln('Keep:',keep,' Change:',change);
  readln;
end.

И тъй, при стартиране на програмата, при мен се изведе следното:

Keep: 33357 Change: 66643

Абсолютно ясно е, че е по-добре да подменим кутиите… Но 66-ците да не бързат да се радват 🙂 Премахнах условието (and Chosen_Box<>Big_Award) и стартирах отново. Това означава, че сега не правя проверка дали след като играчът отвори кутията в нея не е голямата награда от 10000….000 лв. Резултатът беше:

Keep: 33636 Change: 33234

А, ами къде отидоха останалите 33130 случая? Ами при тях просто играчът отваря голямата награда! Т.е. сумарно шансът е 50 на 50… Ето, че и 50-ците имат повод за радост. И какво се получава в крайна сметка?

Имаме два момента: преди и след отварянето на кутията. Преди отварянето (момент 1) на кутията шансът да сме избрали голямата награда е 1/3. След отварянето на кутията (момент 2) с 0,20 ст. остават две кутии и шансът е 1/2, т. е. 50 на 50. Заблудата идва от това, че ако вече сме в момент 2, шансът за печалба при размяна на кутиите, отнесен към първоначалният момент 1 е 2/3, а към настоящият момент 2 е 1/2.

Тоест, правилният отговор е ИМАМЕ СДЕЛКА! Но шансът е 50 на 50 🙂

Шансът би бил 66.67%, ако узнаем без риск за някоя непечеливша кутия. Това става в случай с други игри и други правила, при които водещият или друг играч разкриват непечеливш жребий/кутия/карта/врата/топче/…, както е при Monty Hall-проблемът…

Благодаря на всички, които писаха коментари… И се надявам, че пак ще пишат в следващите задачки. Много сте умни, гордея се с вас! 🙂

И така – краен отговор: 50 на 50!

Просто и логично. В заключение ще кажа само, че на мен задачката много ми хареса и ме накара няколко пъти да се усъмня във всичко.

„Доколко човек е цивилизован зависи не от силната му вяра,

а от готовността му да се съмнява…“

– Henry Louis Mencken


Сподели тази публикация:

12 мнения за “Все още ли имаме сделка?”

  1. Така става когато хората си нямат работа 😛

  2. Mnogo interesno po kakuv slojen nachin si stignal do izvoda che ako ima 2 kutii shansa da otvorish taia s parite e 50% kakto i da go vurtim
    mislia che 10 godishnia mi bratovched shte se spravi dosta po-burzo, a toi dori ne moje da pishe na Pascal

  3. Задачата е ясно поставена и е същата като за колата и козата. Просто заменяме колата с голямата награда и стотинките с кози. Това че играча нацелва в случая да елиминира непечеливша кутия си е същото като водещия да му я c елиминира. В условието на задачата си е казано ясно че играча няма шанс да елиминира печелившата кутия т.е. „Chosen_Box<>Big_Award“. От там нататък статистически погледнато имаш по-голям шанс ако смениш, както е описано в уикипедия. Доста неинтуитивно, но така е с по-сериозната статистика. Ето пример с birthday paradox, който твърди, че от 23ма човека вероятността двама да са родени на един и същи ден, е повече от 50%, а за е 57 – повече от 99%. Това на теория, а на практика няма значение какво решаваш, освен ако не играеш 100000 пъти сделка или не.
    Ето и ВИЦ по въпроса:“Командващ парашутен полк обяснява на парашутистите преди първия им скок: -Длъжен съм да ви предупредя, че 1 на 100 парашута не се отваря… Ама вие няма какво да се притеснявате, защото вие сте има-няма 30 човека.“

  4. Подобен случай имаше в сериалчето „Криминални уравнения“
    Там големият мозък твърдеше, че ако размениш кутиите, шансът е по-голям. Явно тази тема е доста оспорвана.

  5. Задачата е ясно поставена, и няма нищо общо с козата и колата. В случая с козата водещият отваря една от двете останали врати и отваря коза – една от двете кози. В тоя случай имаме 10 стотинки, и 20 стотинки.. и сме 100% сигурни, че от останалите 2 кутии ще отвориш 20ст. Което пък означава, че в никъкъв случай не може първоначално в кутията ти да е имало 20ст.

    Т.Е. В задачата с козите ти отварят една от двете… но не се казва точно коя от двете кози, което пък не изключва възможността всяка от тях да е първоначално избраната от теб.

    Ако кръстим козите 10 и 20 стотинки и кажем, че задачите са еднакви, изпускаме даденото ни по условие, че 20 в никъкъв случай не може да е първоначалният ти избор. И тук гърмиш:

    В алгоритъма си имаш константа Big_award = 1… Къде е константата TwentyCents = 2? Някъде имаш ли проверка, за това, дали Player_Box е различно от TwentyCents??? Все пак условието на задачата го изключва.

  6. Проверката е тук:
    until (Chosen_Box<>Player_Box) and (Chosen_Box<>Big_Award);

  7. Анализирай това (JavaScript):

    // options:
    var boxes = Array(0.1, 0.2, 1000000);
    var change = 0;
    var keep = 0;

    for (var i = 0; i < 100000; i++) { // izbirame sluchaino kutiq koqto ne e 20st. – 10st ili 10000000lv:
    if (Math.random() < 0.5) {
    // 50% 10st
    var FirstChoosen = 0;
    } else {
    // 50% 1000000
    var FirstChoosen = 2;
    }

    // otwarqme kutiqta sys 20 stotinki – kutiq 1

    if (FirstChoosen == 0) {
    // ako sme izbrali kutiq 0 – 10st. ostawashtata e 2 – 10000000
    var LastBox = 2;
    } else if (FirstChoosen == 1) {
    // towa e newuzmojno
    } else if (FirstChoosen == 2) {
    // ako sme izbrali 1000000 ostawashtata e 0 – 10st
    var LastBox = 0;
    }

    if (FirstChoosen == 2) {
    // nashata kutiq pecheli… suotwetno q pazim:
    keep++;
    }
    if (LastBox == 2) {
    // nagradata e w poslednata ostanala kutiq… suotwetno trqbwa da smenim:
    change++;
    }

    }

    alert(„keep: “ + keep + “ / change: “ + change);

  8. Ами… първо много лош код! Цикъл до 100000, за да се избере една от две възможни кутии?! И какво ще стане, ако 100000 пъти се пада все една и съща – програмата ти гърми.
    Иначе прави същото като моята без условието Chosen_Box<>Big_Award, кое трябва да анализирам не разбрах?!

  9. Не мога да форматирам кода в коментар…

    Освен това коментарът ти за рандома ми е подобен на:

    Ами ако:
    repeat
    Chosen_Box:=random(3)+1;
    until (Chosen_Box<>Player_Box) and (Chosen_Box<>Big_Award);
    Зацикли, защото random(3)+1 винаги генерира стойността на Player_Box или Big_Award?

    В поста си беше написал с големи букви „ИМАМЕ СДЕЛКА“ което ме обърка, че си приел 33% / 66% за верен, а всъщност отговорът е, че няма значение. 50% / 50% Така както си го дообяснил надолу, и както съм съгласен с теб, и както не бях допрочел. (за което се извинявам)

    Цялата работа започна от там, че програмата ти връща резултат 33% / 66% в първоначалният си вид, но в първоначаалният си вид решава задачата с козите, а тя пък от своя страна е различна от поставената задача с .10, .20 и 1000…000лв. Аз спорих с Ива, че двете задачи са различни, тя ми каза да ти видя алгоритъма, аз го видях и се оказа, че му трябва промяна. Такава каквато си направил после. И която, както ти каза, го прави еквивалентен с моя. Ива ми каза да ти оставя коментар и аз го направих… Предполагам ако си беше написал програмата, така че при 100000 теста да връща 50000 / 50000 а не 33333 / 33333 щеше да изглежда по-нормално.

    Няма смисъл да говорим едно и също, но да не се разбираме и да се караме. Някой от читателите на блога ти все още не са осъзнали, защо задачата ти не е като тази с козите, и защо ако отговорът на задачат с козите е 66% в полза на смяна, то в твоята е 50%.

  10. Ами всъщност, няма нужда да му мислим толкова… И в двата случая, ако сменим кутиите, шансът ни не е по-малък, така че защо да не кажем ИМАМЕ СДЕЛКА?

  11. Божо каза:
    Подобен случай имаше в сериалчето „Криминални уравнения“
    Там големият мозък твърдеше, че ако размениш кутиите, шансът е по-голям. Явно тази тема е доста оспорвана.

    Край на цитата.
    „Големият мозък“ е прав. Да, случаят е подобен, но и същевременно е съвсем различен.
    Задачата в „Криминални Уравнения“ беше точно The Monty Hall Problem. Шансът наистина се удвоява, ако смениш вратите – прочетете статията в уикипедия, за да се убедите сами. За „Сделка или Не“ нищо не мога да твърдя :]

Вашият коментар

Specify Facebook App ID and Secret in Super Socializer > Social Login section in admin panel for Facebook Login to work

Specify LinkedIn Client ID and Secret in Super Socializer > Social Login section in admin panel for LinkedIn Login to work

Specify GooglePlus Client ID and Secret in Super Socializer > Social Login section in admin panel for GooglePlus Login to work

Вашият имейл адрес няма да бъде публикуван.