Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
23.01.2015
Размер:
375.81 Кб
Скачать

Моделирование парадокса дней рождения

Подойдём к решению задачи последовательно.

Для начала рассмотрим распределение количества совпадений дней рождений для группы из 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('количество человек в группе');

Таким образом, практические расчёты подтверждают теоретические выкладки.

Соседние файлы в папке МП-34