Важная информация
Показано с 1 по 9 из 9

Тема: Парадокс дней рождения. Проверка на Паскале =)

  1. #1 Парадокс дней рождения. Проверка на Паскале =) 
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    "Парадо́кс дней рожде́ния — утверждение, гласящее, что если дана группа из 23 или более человек, то вероятность того, что хотя бы у двух из них дни рождения (число и месяц) совпадут, превышает 50 %. Для группы из 60 или более человек вероятность совпадения дней рождения хотя бы у двух её членов составляет более 99 %, хотя 100 % она достигает, только когда в группе не менее 367 человек (с учётом високосных лет).
    Такое утверждение может показаться противоречащим здравому смыслу, так как вероятность одному родиться в определённый день года довольно мала, а вероятность того, что двое родились в конкретный день — ещё меньше, но является верным в соответствии с теорией вероятностей. Таким образом, оно не является парадоксом в строгом научном смысле — логического противоречия в нём нет, а парадокс заключается лишь в различиях между интуитивным восприятием ситуации человеком и результатами математического расчёта."
    ([Ссылки могут видеть только зарегистрированные пользователи. ])

    Действительно, сходу, когда я наткнулся на эту статейку, мне это показалось маловероятным, и заинтересовало. Тут же захотелось проверить самому (даже не смотря на то, что чепуху в википедии хоть и можно написать, однако без достаточных оснований она тут же выпиливается).
    Есть куча способов проверить это, например, исследовать список своих друзей в том же контакте, либо же доказать это, составив и решив формулу с сотнями матана (которые, кстати, предлагаются в википедии, в соответствующей статье), однако этот способ явно не для меня =)))
    Я же решил составить небольшую программку, которая будет проверять это не в теории, а на деле. Итак, в качестве языка программирования выберу, пожалуй, свой любимый Турбо Паскаль.

    Итак, исходный код

    Код pascal:
    Const
        HumanCount = 23;
        TestCount = 500;
    Var
        I, II, III, Count, Prob: Word;
        BirthDay: Array [1..HumanCount] Of Word;
    Begin
        Randomize;
        Prob:= 0;
        For III:= 1 To TestCount Do Begin
            For I:= 1 To HumanCount Do BirthDay[I]:= Random(366);
            {Порядковый день рождения человека № I - BirthDay[I]}
            Count:= 0;
            For I:= 1 To HumanCount Do Begin
                For II:= 1 To HumanCount Do Begin
                    Inc(Count, Word(Not (I = II) And (BirthDay[I] = BirthDay[II])));
                    {Люди под номерами I и II имеют одинаковый день рождения}
                End;
            End;
            Inc(Prob, Word(Count > 0));
        End;
        WriteLn('Всего совпало хотя-бы раз в ', Prob, ' из ' , TestCount, ' итераций, в каждой по ', HumanCount, ' человек');
        Prob:= Round((Prob / TestCount) * 100);
        WriteLn('Итоговая вероятность приблизительно ', Prob, '%');
        ReadLn;
    End.

    В данном примере, производиться 500 оцениваний, для более равномерного результата. Сам же результат колеблется от 45 до 55 процентов, что в целом неплохо. В принципе, я и не ожидал другого варианта, что "парадокс" не подтвердиться, особенно если он уже доказан, однако было интересно проверить эту занимательную чепуху самому =)))
    Последний раз редактировалось Абадябер; 07.03.2011 в 00:47.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  2. #2  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,536
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Интересно

    Я тоже, когда фильм "Библейчкий код" посмотрел, решил сделать программу для поиска SKIP-кодов в текстах. Вообщем, почти работала, но ограничение в 64кб памяти сильно мешает
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  3. #3  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    А что за SKIP коды? В чем их суть. Погуглил SKIP код, но ничего толкового не нашел, кроме кучи синонимов. По запросу библейский код тоже упоминаний именно SKIP кодов не обнаружил...
    Дружба-магия-радость!
    Ответить с цитированием  
     

  4. #4  
    Супер модератор Аватар для Kakos_nonos
    Регистрация
    07.01.2011
    Адрес
    Кубань
    Сообщений
    1,536
    Сказал(а) спасибо
    126
    Поблагодарили 432 раз(а) в 293 сообщениях
    Записей в блоге
    6
    Скип код это типа прочитывать текст не подряд, а через несколько букв. Например, 1-ую, 3-ую, 5-ую, 7-ую. Это через одну букву, а можно через 10, 50, 100.
    В том фильме один учёный в библии нащёл таким методом всякую информацию о будущем и тому подобном, а другой учёный доказал что с помощью этого метода можно в любом большом тексте найти любую информацию, и в качестве доказательства, нашёл подробную информацию о убийстве Кенеди в одной книге 19 века.
    Особенно в этом фильме запомнился ДОС с ивритофикатором
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  5. #5  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Хех, мб и мне попробовать
    Дружба-магия-радость!
    Ответить с цитированием  
     

  6. #6  
    Новичок
    Регистрация
    19.01.2013
    Сообщений
    9
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Код pascal:
    const
    month:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
    var
    humans:array[1..367] of integer;
    i,j,a,pro,n:integer;
    p:boolean;
    procedure qsort(l,r:integer);
    var
    i,j,x,t:integer;
     
    begin
    i:=l;
    j:=r;
    x:=humans[(l+r) div 2];
    repeat
    while humans[i]<x do i:=i+1;
    while humans[j]>x do j:=j-1;
    if i<=j then begin
    t:=humans[i];
    humans[i]:=humans[j];
    humans[j]:=t;
    i:=i+1;
    j:=j-1;
    end;
    until i>j;
    if j>l then qsort(l,j);
    if i<r then qsort(i,r);
    end;
     
     
    begin
    writeln;
    read(n);
    pro:=0;
    for j:=1 to 100 do begin
    for i:=1 to n do begin
    a:=random(12)+1;
    humans[i]:=a*100+random(month[a])+1;
    end;
    qsort(1,n);
    p:=false;
    for i:=1 to n-1 do if humans[i]=humans[i+1] then begin
    p:=true;
    break;
    end;
    if p=true then pro:=pro+1;
    end;
    write(pro);
    end.
    Хм,действительно))))
    Последний раз редактировалось Абадябер; 19.01.2013 в 18:29.
    Ответить с цитированием  
     

  7. Пользователь сказал cпасибо:

    Абадябер (19.01.2013)

  8. #7  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    belya, интересный вариант. Посмотрел, и сразу понял, что совсем нелегко мне дается чтение чужого кода
    Мне не совсем понятно, зачем было задавать массив month. Проще сразу бросить рэндом на 365 или 366 значений - ведь в диапазон [1..365] уже входят все даты каждого месяца. Также, не совсем понимаю, зачем было использовать сортировку?
    Дружба-магия-радость!
    Ответить с цитированием  
     

  9. #8  
    Новичок
    Регистрация
    19.01.2013
    Сообщений
    9
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Прости,я действительно наиндусил( Не сразу осознал,что в году только 365 дней.
    А сортировка первоначально была для того,чтоб вычислить количество всех совпадающих дат. Потом я ее просто забыл убрать
    Ответить с цитированием  
     

  10. #9  
    Новичок
    Регистрация
    19.01.2013
    Сообщений
    9
    Сказал(а) спасибо
    0
    Поблагодарили 1 раз в 1 сообщении
    Ну,ради интереса решил еще посчитать,у скольки человек в группе совпадает дата рождения
    Ответить с цитированием  
     

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. День рождения Абадябера
    от Konstantin Shcherba в разделе Архив
    Ответов: 15
    Последнее сообщение: 26.12.2013, 22:22
  2. Продвижение Вашего сайта в поисковых системах. Попадание в ТОП поисковой выдачи от 60 дней!*
    от Дмитрий Сатаров в разделе Оптимизация, продвижение и аудит
    Ответов: 6
    Последнее сообщение: 22.01.2013, 20:34
  3. Нужно вычислить кол-во дней между датами
    от Рафиль в разделе Turbo Pascal
    Ответов: 1
    Последнее сообщение: 19.01.2013, 19:08
  4. мультипликация на паскале
    от vetal в разделе Turbo Pascal
    Ответов: 3
    Последнее сообщение: 03.07.2012, 22:45
  5. задача на паскале
    от vetal в разделе Turbo Pascal
    Ответов: 3
    Последнее сообщение: 18.04.2012, 17:10
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •