о жизни, вебе, друзьях, семье и многом другом…
RSS icon Email icon Home icon
  • Парадокс Монти Холла однако…

    Совсем недавно узнал о таком понятии теории вероятности, как Парадокс Монти Холла.

    Вероятно, для многих людей – это очевидное понятие, но для меня стало настоящим открытием.

    Как всегда, некоторые теоретические сведения с Wikipedia (ссылка на статью целиком):

    Парадокс Монти Холла — одна из известных задач теории вероятностей, решение которой, на первый взгляд, противоречит здравому смыслу. Задача формулируется как описание гипотетической игры, основанной на американском телешоу «Let’s Make a Deal», и названа в честь ведущего этой передачи. Наиболее распространенная формулировка этой задачи, опубликованная в 1990 году в журнале Parade Magazine, звучит следующим образом:

    Представьте, что вы стали участником игры, в которой вам нужно выбрать одну из трех дверей. За одной из дверей находится автомобиль, за двумя другими дверями — козы. Вы выбираете одну из дверей, например, номер 1, после этого ведущий, который знает, где находится автомобиль, а где — козы, открывает одну из оставшихся дверей, например, номер 3, за которой находится коза. После этого он спрашивает вас, не желаете ли вы изменить свой выбор и выбрать дверь номер 2. Увеличатся ли ваши шансы выиграть автомобиль, если вы примете предложение ведущего и измените свой выбор ?

    Хотя данная формулировка задачи является наиболее известной, она несколько проблематична, поскольку оставляет некоторые важные условия задачи неопределенными. Ниже приводится более полная формулировка.

    При решении этой задачи обычно рассуждают примерно так: после того, как ведущий открыл дверь, за которой находится коза, автомобиль может быть только за одной из двух оставшихся дверей. Поскольку игрок не может получить никакой дополнительной информации о том, за какой дверью находится автомобиль, то вероятность нахождения автомобиля за каждой из дверей одинакова, и изменение первоначального выбора двери не дает игроку никаких преимуществ. Однако такой ход рассуждений неверен. Если ведущий всегда знает, за какой дверью что находится, всегда открывает ту из оставшихся дверей, за которой находится коза, и всегда предлагает игроку изменить свой выбор, то вероятность того, что автомобиль находится за выбранной игроком дверью, равна 1/3, и, соответственно, вероятность того, что автомобиль находится за оставшейся дверью, равна 2/3. Таким образом, изменение первоначального выбора увеличивает шансы игрока выиграть автомобиль в 2 раза. Этот вывод противоречит интуитивному восприятию ситуации большинством людей, поэтому описанная задача и называется парадоксом Монти Холла.

    (По ссылке полная статья)

    Так вот, для меня этот парадокс совсем-совсем неочевиден, и мне стало интересно попробовать его подтвердить (если можно так выразиться) эмпирическим образом. 

    Для этого было написано маленькое php приложение. Те, кому это интересно, могут попробовать выполнить его на своей машине. Парадокс ожидаемо подвердился, но от того для меня более понятным не стал :)

    Ниже листинг программы

    <?php
    /*
    Представьте, что вы стали участником игры, в которой вам нужно выбрать
    одну из трех дверей. За одной из дверей находится автомобиль, за двумя
    другими дверями - козы. Вы выбираете одну из дверей, например, номер 1,
    после этого ведущий, который знает, где находится автомобиль, а где -
    козы, открывает одну из оставшихся дверей, например, номер 3, за которой
    находится коза. После этого он спрашивает вас, не желаете ли вы
    изменить свой выбор и выбрать дверь номер 2. Увеличатся ли ваши шансы
    выиграть автомобиль, если вы примете предложение ведущего и измените
    свой выбор ?
    */

    //количество эмпирических выборок
    $iters = 10000;

    //количество вариантов выбора (в изначальной задаче - 3)
    $number_of_choices = 3;

    //угадали, если изменим решение после открытия всех дверей, кроме двух
    $true = 0;

    //не угадали, если изменим решение после открытия всех дверей, кроме двух
    $false = 0;

    //начинаем выборку
    for ($i = 0; $i< $iters; $i++)
    {
     //правильный ответ - случайное число от 1 до $number_of_choice
     $answer = rand(1,$number_of_choices);

     //наш выбор - случайно число от 1 до $number_of_choice
     $choice = rand(1,$number_of_choices);
     
     //массив открытых вариантов
     $opened = array();

     //открываем все варианты, кроме нашего выбора и правильного ответа
     //либо, если наш выбор = правильный ответ, правильный ответ и любой неправильный вариант
     for ($j=0; $j< $number_of_choices - 2; $j++)
     {
      $generated = 0;
      while (($generated!=0) && ($generated!=$answer) &&($generated!=$choice))
      {
       $generated = rand(1, $number_of_choices);
      }

      $opened[] = $generated;
     }
     //теперь проверяем, что будет, если мы изменим решение
     if ($choice == $answer)
     {
      //если мы изначально угадали
      $false++;
     }
     else
     {
      //если мы изменили решение
      $true++;
     }
    }

    echo "Если мы изменим решение, то угадаем с вероятностью:<br><b>$true/$iters</b><br>";
    echo "Если мы сохраним изначальное решение, то угадаем с вероятностью:<br><b>$false/$iters</b><br>";

     

    ?>

  • Новый сайт

    www.ladachess.ru

    Дизайн и верстка: Дмитрий Шуршилин

     

    Программирование: Я

  • Реализация Польской Инверсной Записи (ПОЛИЗ) на PHP

    Польская Инверсная Запись (ПОЛИЗ) или Обратная польская нотация (ОПН) — форма записи математических выражений, в которой операнды расположены перед операторами.
    Полностью получить информацию о том, что это такое можно на соответствующей странице Wikipedia (http://ru.wikipedia.org/wiki/Обратная_польская_запись).
    Я же здесь приведу общие сведения, взятые со страницы http://algolist.manual.ru/maths/misc/revpn.php.

    Общие теоретические сведения

    Обpатная польская нотация

    Одной из главных пpичин, лежащих в основе появления языков пpогpаммиpования высокого уpовня, явились вычислительные задачи, тpебующие больших объёмов pутинных вычислений. Поэтому к языкам пpогpаммиpования пpедъявлялись тpебования максимального пpиближения фоpмы записи вычислений к естественному языку математики. В этой связи одной из пеpвых областей системного пpогpаммиpования сфоpмиpовалось исследование способов выpажений. Здесь получены многочисленные pезультаты, однако наибольшее pаспpостpанение получил метод тpансляции с помощью обpатной польской записи , котоpую пpедложил польский математик Я. Лукашевич.

    Пример

    Пусть задано пpостое аpифметическое выpажение вида:
    (A+B)*(C+D)-E (1)
    Пpедставим это выpажение в виде деpева, в котоpом узлам соответствуют опеpации, а ветвям - опеpанды. Постpоение начнем с коpня, в качестве котоpого выбиpается опеpация, выполняющаяся последней. Левой ветви соответствует левый опеpанд опеpации, а пpавой ветви - пpавый. Деpево выpажения (1) показано на pис. 1.
    pис. 1
     
    Совеpшим обход деpева, под котоpым будем понимать фоpмиpование стpоки символов из символов узлов и ветвей деpева. Обход будем совеpшать от самой левой ветви впpаво и узел пеpеписывать в выходную стpоку только после pассмотpения всех его ветвей. Результат обхода деpева имеет вид:
    AB+CD+*E- (2)
    Хаpактеpные особенности выpажения (2) состоят в следовании символов опеpаций за символами опеpандов и в отсутствии скобок. Такая запись называется обpатной польской записью.
    Обpатная польская запись обладает pядом замечательных свойств, котоpые пpевpащают ее в идеальный пpомежуточный язык пpи тpансляции. Во-пеpвых, вычисление выpажения, записанного в обpатной польской записи, может пpоводиться путем однокpатного пpосмотpа, что является весьма удобным пpи генеpации объектного кода пpогpамм. Напpимеp, вычисление выpажения (2) может быть пpоведено следующим обpазом:
    #
    Анализиpуемая стpока
    Действие
    A B + C D + * E -
    r1=A+B
    1
    r1 C D + * E -
    r2=C+D
    2
    r1 r2 * E -
    r1=r1*r2
    3
    r1 E -
    r1=r1-E
    4
    r1
    Вычисление окончено
    Здесь r1, r2 - вспомогательные пеpеменные.
     
    Во-втоpых, получение обpатной польской записи из исходного выpажения может осуществляться весьма пpосто на основе пpостого алгоpитма, пpедложенного Дейкстpой. Для этого вводится понятие стекового пpиоpитета опеpаций(табл. 1):
    Таблица 1
    Операция
    Приоритет
    (
    0
    )
    1
    +|-
    2
    *|/
    3
    **
    4
     
    Пpосматpивается исходная стpока символов слева напpаво, опеpанды пеpеписываются в выходную стpоку, а знаки опеpаций заносятся в стек на основе следующих сообpажений:
    а) если стек пуст, то опеpация из входной стpоки пеpеписывается в стек;
    б) опеpация выталкивает из стека все опеpации с большим или pавным пpиоpитетом в выходную стpоку;
    в) если очеpедной символ из исходной стpоки есть откpывающая скобка, то он пpоталкивается в стек;
    г) закpывающая кpуглая скобка выталкивает все опеpации из стека до ближайшей откpывающей скобки, сами скобки в выходную стpоку не пеpеписываются, а уничтожают дpуг дpуга.
    Пpосматpиваемый
    символ
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Входная строка
    (
    A
    +
    B
    )
    *
    (
    C
    +
    D
    )
    -
    E
     
    Состояние
    стека
    (
    (
    +
    (
    +
    (
     
    *
    (
    *
    (
    *
    +
    (
    *
    +
    (
    *
    *
    -
    -
     
    Выходная
    строка
     
    A
     
    B
    +
       
    C
     
    D
    +
    *
    E
    -
     

    Реализация на PHP

    При реализации использован PHP 5.
    По сути, система нужна для того, чтобы вводить арифметические выражение в свободной форме ("(12-32)+23/(11-2)") и получать правильный результат
    Исходное приложение целиком можно скачать отсюда.
    В системе используются следующие классы:
    1. Calculator – собственно сама реализация полиза
    2. PolizItem – реализует один элемент входной строки – это может быть операция («*/-+()») или операнд: число (1, 2.12, 3.432,23432423) или ссылка на число (A2, C4, F23)
    3. PolizConstants
    4. DataTable - класс для отображения таблицы данных. Эта таблица реализована для показа возможностей полиза по оперированию не только числовыми значениями, но и ссылками на значения в каких-либо источниках данных.
     Если у кого-то возникнут вопросы по работе этого приложения- прошу обращаться ко мне
  • PHPCLUB.RU

    :) Я нашел упоминание о своем сайте на форуме www.phpclub.ru :)

    http://www.phpclub.ru/talk/showthread.php?s=&threadid=100067

    Кстати, моя статья об использовании flv-плеера на сайте видимо пользуется определенной популярностью, уже 5 человек постучались мне в аську с благодарностями, а вот теперь и на пхп клубе))))

     
     

  • Delphi For PHP

    Нашел в инете статью Delphi for PHP first impressions. В ней естественно рассказывается о новой визуальной оболочке для PHP, которая позволяет создавать веб-приложения на PHP, как в Visual Studio или Delphi. Интересно, что Delphi For PHP поддерживает событийную модель. Но, в общем, как следует из этой статьи, ничего особо хорошего у создателей сего программного продукта не получилось (цитата: «I will say that the release looks rushed, which is a shame.»). А жаль, идея хороша.

  • Вставка flv видео на сайт (аля YouTube)

    В последнее время очень популярно выкладывать видео на блоги/сайты. Конечно, остается вариант простого выкладывания wmv видео в виде ссылки на него, тогда в IE видео откроется в том же окне, при этом будет использоваться Windows Media Player.

    На мой взгляд, последний вариант не очень удобен: он предполагает, что у клиента есть Media Player  и помимо этого тормозной (ибо player’у еще надо и загрузиться).

    Но, все-таки, для проигрывания видео на сайте лучше всего использовать flv проигрыватель. Для его использования достаточно, чтобы на браузере был установлен flash-плеер. Проигрыватель представляет собой flash-мувик размером 25кБ. Скачать его можно с http://www.jeroenwijering.com/?item=Flash_Video_Player.

    Далее все просто:

    Берем нужный нам мувик в любом формате. Качаем Total Converter отсюда или из любого места, которое подскажет Яндекс, Гугл или кто-то еще.

    Конвертим видео в формат flv.

    Копируем файл flvplayer.swf из скачанного нами архива с плеером на наш сайт.

    Копируем видео в формате flv на сайт.

    В тексте сайта/блога вставляем ссылку на флэш

    <embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="flvplayer.swf" width="300" height="200" type="application/x-shockwave-flash" flashvars="file=/flv/video.flv" bgcolor="#FFFFFF" />

    Здесь меняем src на url плеера, flashvars на url мувика. Width и  Height я думаю объяснять не надо.

    Вот и все. Просто и довольно симпатично:)

     

  • Отправка почты через SMTP на PHP

    Сегодня столкнулся с ситуацией, что оказывается некоторые хостинги запрещают отправку почты через sendmail.

    Нашел, думаю, самый простой метод борьбы с этим:)

    1. качаем библиотеку phpmailer

    2. копируем оттуда 2 файла: class.phpmailer.php и class.smtp.php

    3. в своем скрипте пишем:

    <?php
    require("class.phpmailer.php"); // укажите путь к файлу class.phpmailer.php
    $mail = new PHPMailer();
    $mail->IsSMTP();// отсылать используя SMTP
    $mail->Host     = "mail.life-host.net"; // SMTP сервер
    $mail->SMTPAuth = true;     // включить SMTP аутентификацию
    $mail->Username = "user@domain.com";  // пропишите Ваш почтовый адрес
    $mail->Password = "pass"; // введите пароль на указанный ящик
    $mail->From     = "user@domain.com"; // укажите от кого письмо
    $mail->FromName = "Mailer"; // имя отправителя
    $mail->AddAddress("user@domain.com","Name"); // е-маил кому отправлять и на какое имя
    $mail->AddReplyTo("user@domain.com","Info"); // е-маил и имя на который пойдет ответ на Ваше письмо
    $mail->WordWrap = 50;// set word wrap
    $mail->IsHTML(true);// отправить в HTML формате

    $mail->Subject  =  "Here is the subject"; // тема письма
    $mail->Body     =  "This is the HTML body"; // тело письма в html формате

    $mail->AltBody  =  "This is the text-only body"; // тело письма текстовое

    if(!$mail->Send())
    {
       echo "Письмо не отправлено ";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }
    echo "Письмо отправлено";
    ?>

    4. Вместо Host, UserName, Password пишем реальные данные с какого-нибудь mail сервера (те, которые вы указываете при настройке почты, скажем в The BAT или Outlook Express

    5. в общем, все должно заработать:)

  • ASP.NET vs PHP

    Недавно наткнулся на www.gotdotnet.ru на статью Производительность приложений ASP.NET и PHP .

    Резюмируя содержание:
    Gaidar Magdanurov пишет одно и то же приложение сначала на asp.net, потом на php

    написание кода проекта на PHP - ~48 рабочих часов. Разработка аналогичного кода проекта на ASP.NET ~18 часов!

    После этого оказывается, что

    ASP.NET показал на 20-30% большую производительность

    Но, все это из-за того, что php медленнее работает с Microsoft SQL Server, что в общем-то логично:) 

    Таким образом, следует заключить, что все-таки интерпретатор PHP работает шустрее, чем генератор кода ASP.NET

    Выводы:

    1. ASP.NET за счет использования разнообразных серверных контролов позволяет создавать приложения значительно быстрее (одни валидаторы чего стоят!). Да и функции Framework помогают там, где в PHP их просто нет и необходимо создавать их самому. Использование самописных функций в PHP и функций Framework давало закономерное преимущество ASP.NET, причем иногда на 500-600% (закономерно, ведь интерпретатору PHP всякий раз приходилось эти функции анализировать и выполнять заново).
    2. Работа с SQL Server в ASP.NET значительно превосходит работу в PHP, что с хранимыми процедурами, что без. (Тоже закономерно, ведь SQL Server все-таки роднее ASP.NET’у). Кстати, тут стоит отметить и тот факт, что SQL Server по функциям и производительности превосходит MySQL. По функциональности - значительно, по производительности (не используя хранимых процедур, которых в MySQL пока нет) не так уж и сильно, но учитывая возможности SQL Server, можно считать и здесь победу весьма ощутимой.
    3. Работа с файлами и генерация кода и там и там происходят сравнимо (разницу в производительности можно и игнорировать, поскольку она лежит в предеах погрешности эксперимента).
    4. Работа с XML файлами, различными кодировками текста проста до безобразия.

    А теперь немного добрых слов в адрес PHP:
    4. Все-таки PHP дает контролировать HTML код целиком и полностью. Когда-то это плюс, а когда-то ASP.NET, генерирующий код под конкретный броузер, основываясь на его возможностях, все-таки более предпочтителен.
    5. Маленькие тестовые приложения на PHP работают быстрее. Возможно за счет небольшого количества кода и вызываемых функций, тогда вся мощь Framework все-таки не нужна и "висит мертвым грузом"
    6. Обновление файлов программной логики в ASP.NET требует перекомпиляции сборки, в PHP же этого не надо, файлы являются отдельными частями системы, а в ASP.NET сборка является "цельным куском".

    Мои выводы:

    Хоть я и работаю сейчас на asp.net, php мне нравится гораздо больше. Может быть, когда я разберусь во всех (или почти) аспектах программирования на asp.net , я скажу, что последний лучше, но в данный момент я предпочитаю php!