- •Статическое моделирование парадокса дней рождения
- •Решение задачи Упрощение модели
- •Теоретическое решение задачи Задача 1.
- •Задача 2.
- •Задача 3.
- •Моделирование парадокса дней рождения
- •Моделирование схожих задач Задача 2.
- •Задача 3.
- •Более сложные варианты парадокса дней рождения.
- •Число опрошенных до первого совпадения дней рождения у любых двух человек.
- •Заключение
Моделирование парадокса дней рождения
Подойдём к решению задачи последовательно.
Для начала рассмотрим распределение количества совпадений дней рождений для группы из nчеловек приNопытах в серии.
function [a] = birthday_n (n, N)
% распределение количества совпадений д/р в группе из n человек
%n = 50;
%N = 3000; % количество опытов в серии
a = zeros(N,1);
for i = 1:N
x = randi(365, n, 1); % задание дат рождения в группе
xs = sort(x);
xs_d = diff(xs);
s0 = (xs_d == 0);
s = sum (s0); % количество совпадений
a(i,1) = s;
end
end
С
помощью этой функции построим распределения
для конкретных чисел.
>> a = birthday_n (50, 3000);
>> hist(a, 100);
>> grid on
>> xlabel ('Количество совпадений')
>> ylabel ('Количество опытов из серии')
>> title ('Группа из 50 человек')
>> a = birthday_n (23, 3000);
>> a = birthday_n (100, 3000);
Т
аким
образом, в группе из 23 человек в среднем
1 совпадение дат, из 50 – 3 совпадения, а
из 100 – уже 12.
Для наглядности построим график зависимости количества совпадений дат от числа участников.
function [mean] = birthday (N, M)
% среднее число совпадений д/р в группе из M человек
%N = 3000; % количество опытов в серии
%M = 200; % количество серий = количество человек в группе
a = zeros(N,1);
mean = zeros(M,1); % объявление заранее просто для ускорения вычисления
for j = 1:M
for i = 1:N
x = randi(365, j, 1); % задание дат рождения в группе
xs = sort(x);
xs_d = diff(xs);
s0 = (xs_d == 0);
s = sum (s0); % количество совпадений
a(i,1) = s;
end
m = round (sum(a) / N); % среднее число совпадений среди N опытов
mean(j,1) = m;
end
end
% в итоге - на j-м месте в массиве mean - среднее число совпадений д/р в
% группе из j человек
>> b = birthday(3000, 300);
>> x=1:300;
>> hPlot = plot(x, b);
>> grid on
>> set(hPlot, 'LineWidth', 3)
>> hAxes = gca;
>> set(hAxes, 'xtick', [0:25:300])
>> title('Зависимость количества совпадений дней рождения от числа членов группы')
>> xlabel ('Число участников')
>> ylabel ('Совпадения')
Таким образом, видно, что число совпадений существенно уже при небольшом наборе исследуемых.
Перейдём теперь к определению вероятности.
function [pm] = birthday_n_p (n)
% вероятность совпадения др хотя бы у двух человек в группе из n человек
%n = 50;
N = 3000; % количество опытов в серии
M = 1000; % количество серий
a = zeros(N,1);
for j = 1:M
for i = 1:N
x = randi(365, n, 1); % задание дат рождения в группе
xs = sort(x);
xs_d = diff(xs);
s0 = (xs_d == 0);
s = sum (s0); % количество совпадений
a(i,1) = s;
end
b = (a ~= 0); % считаем вероятность совпадения
bs = sum(b);
p(j,1) = bs / N; % массивчик получили
end
pm = sum(p) / M; % среднее значение вероятности
end
>> c = birthday_n_p (50)
c = 0.9705
Т.е. в данном случае значение вероятности, полученное моделированием эксперимента, совпадает с теоретическим ().
Сделаем обобщение и построим распределение вероятности успеха для различного числа участников.
function [pm] = birthday_p ()
% вероятность совпадения др хотя бы у двух человек в группе из n человек
% n меняется от 1 до 100;
N = 3000; % количество опытов в серии
nn = 100;
for n = 1:nn
a = zeros(N,1);
for i = 1:N
x = randi(365, n, 1); % задание дат рождения в группе
xs = sort(x);
xs_d = diff(xs);
s0 = (xs_d == 0);
s = sum (s0); % количество совпадений
a(i,1) = s;
end
ss = (a ~= 0);
pm(n, 1) = sum(ss) / N; % среднее значение вероятности
end
end
>> p = birthday_p();
>> p = p * 100;
>> x = 1:100;
>> hPlot = plot(x, p);
>> grid on
>> hAxes = gca;
>> set(hAxes, 'xtick', [0:5:100])
>> set(hPlot, 'LineWidth', 2)
>> axis([0,100, 0,102])
>> title ('Распределение вероятности совпадения дат дней рождения в группах с разным количеством человек')
>> xlabel('вероятность, %'),ylabel('количество человек в группе');
Т
аким
образом, практические расчёты подтверждают
теоретические выкладки.
