- •Статическое моделирование парадокса дней рождения
- •Решение задачи Упрощение модели
- •Теоретическое решение задачи Задача 1.
- •Задача 2.
- •Задача 3.
- •Моделирование парадокса дней рождения
- •Моделирование схожих задач Задача 2.
- •Задача 3.
- •Более сложные варианты парадокса дней рождения.
- •Число опрошенных до первого совпадения дней рождения у любых двух человек.
- •Заключение
Моделирование схожих задач Задача 2.
Вычислим ответ с помощью небольшого скрипта.
% задаём N раз 2 даты, смотрим количество совпадений
n = 2;
N = 3000;
a = zeros(N,1);
M = 1000;
for j = 1:M % повторяем M раз, потом усредняем
for i = 1:N
x = randi(365, n, 1); % задание дат рождения в группе
a(i,1) = (x(1,1) == x(2,1));
end
s = sum(a);
p(j,1) = s / N;
end
pp = sum(p) / M
>> task2
pp= 0.0027
Эту же задачу можно решить и с помощью использованной в предыдущей задаче функции:
>>d = birthday_n_p(2)
d = 0.0027
Как и следовало ожидать, результат совпадает с теорией (Задача 2.).
Задача 3.
Построим график распределения вероятности успеха в зависимости от количества человек в группе.
function [p] = single_b()
M = 400; % n меняется от 1 до M
N = 4000; % число опытов в серии
for n = 1:M
for i = 1:N
x = randi(365,1,1); % c этим будем сравнивать
y = randi (365,n,1); % это группа
for k = 1:n ys(k,1) = (x == y(k,1)); end % собственно сравниваем
s(i,1) = sum(ys);
end
sb = (s ~= 0);
p(n,1) = sum(sb)/N;
end
p = p * 100;
end
>> p = single_b;
>> x = 1:400;
hPlot = plot(x,p);
grid on
hAxes = gca;
set(hAxes, 'xtick', [0:25:400])
set(hAxes, 'ytick', [0:5:70])
x
label('Количество
человек'),ylabel('Вероятность');
Таким образом, значения на графике соответствуют теоретическим расчётам (Задача 3.).
Более сложные варианты парадокса дней рождения.
(Задача 4.)
Вначале рассчитаем вероятность совпадения дней рождения у трёх людей в группе из nчеловек.
function [p] = diffic_b (n)
% совпадение др одновременно для 3х людей
%n = 100; % число участников в группе
N = 4000; % количество опытов в серии
z = zeros(N, 1);% сюда количество совпадений записывать будем
for i = 1:N
x = randi(365, n, 1);
xs = sort(x);
xd = diff(xs);
for j = 1:(n-2)
if (xd(j) == 0)
if (xd(j+1) == 0)
z(i,1) = z(i,1) + 1;
end
end
end
end
z1 = (z ~= 0);
p = sum(z1)/N;
end
Для некоторых значений nрезультаты будут выглядеть следующим образом.
>> c = diffic_b(50), c = 0.1245
>> c = diffic_b(70), c = 0.3055
>> c = diffic_b(100), c = 0.6375
>> c = diffic_b(150), c = 0.9692
>> c = diffic_b(200), c = 0.9998
>>c = diffic_b(250), c = 1
Как видно, вероятность успеха теперь намного ниже, чем в классическом случае.
Рассмотрим теперь случай совпадения дней рождения у случайного числа mв группе изnчеловек. Необходимая функция будет иметь следующий вид.
function [pm] = diffic_b_m (n, m)
% совпадение др одновременно для m людей
%n = 100; % число участников в группе
%m = 3;
N = 3000; % количество опытов в серии
M = 1000; % количество серий
for h = 1:M
z = zeros(N, 1);% сюда количество совпадений записывать будем
for i = 1:N
x = randi(365, n, 1);
xs = sort(x);
for j = 1:(n-1)
if xs(j) == xs(j+1)
k = j;
while (k <= n-1)&&(xs(k) == xs(k+1))
k = k + 1;
end
if k ~= n
if k - j == m - 1
z(i,1) = z(i,1) + 1;
end
end
end
end
end
z1 = (z ~= 0);
p(h,1) = sum(z1) / N;
end
pm = sum(p) / M;
end
Проверим корректность работы данной функции.
>> a = diffic_b_m(23, 2), a = 0.4902
>> a = diffic_b_m(50, 2), a = 0.9678
>> a = diffic_b_m(70, 2), a = 0.9991
>> b = diffic_b_m(50,3), b = 0.1240
>> b = diffic_b_m(100,3), b = 0.6414
Очевидно, что данные результаты сравнимы с полученными ранее.
Приведём для наглядности ещё несколько примеров для разных mиn.
p(m,n) =p(100, 4) = 0.0629
p(200, 4) = 0.5885
p(200, 5) = 0.0876
p(200, 7) = 0.0006
Построим графики зависимостей
и
при некоторых фиксированных значениях
второй переменной.
function [p] = diffic_m (n, M)
% совпадение др одновременно для m людей, m меняется от 1 до M
%n = 100; % число участников в группе
N = 3000; % количество опытов в серии
%M = 10;
for m = 1:M
z = zeros(N, 1);% сюда количество совпадений записывать будем
for i = 1:N
x
= randi(365, n, 1);
xs = sort(x);
for j = 1:(n-1)
if xs(j) == xs(j+1)
k = j;
while (k <= n-1)&&(xs(k) == xs(k+1))
k = k + 1;
end
if k ~= n
if k - j == m - 1
z(i,1) = z(i,1) + 1;
end
end
end
end
end
z1 = (z ~= 0);
p(m,1) = sum(z1) / N;
end
end

function [p] = diffic_n (M, m)
% совпадение др одновременно для m людей в группе из n человек
%n = 100; % число участников в группе, n меняется от 1 до M
N = 3000; % количество опытов в серии
%M = 200;
for n = 1:M
z = zeros(N, 1);% сюда количество совпадений записывать будем
for i = 1:N
x = randi(365, n, 1);
xs = sort(x);
for j = 1:(n-1)
if xs(j) == xs(j+1)
k = j;
while (k <= n-1)&&(xs(k) == xs(k+1))
k = k + 1;
end
if k ~= n
if k - j == m - 1
z(i,1) = z(i,1) + 1;
end
end
end
end
end
z1 = (z ~= 0);
p(n,1) = sum(z1) / N;
end
end
На следующем графике изображены
зависимости
для
.

