基于matlab编程的“生日悖论”仿真模拟实验

摘要

本文针对概率论老师提出的“生日悖论[1]”问题进行研究,通过matlab编程实现仿真,并将最终结果以图片形式表示出来。

关键词:
仿真 古典概型 生日悖论 matlab tabulate函数 函数化

一、问题重述

老师要求我们以“生日悖论”为题,在10人、30人、60人、90人的情况下随机输入每个人的生日y,输出图表,图表内容包括:
1、横坐标为迭代次数x(x∈[1,200]);
2、纵坐标为日期y(y∈[1,365]);
3、黑色叉号(x)表示不重复日期;
4、红色叉号(red X)表示重复日期;
5、标题包括本次迭代中仿真人数(/人)和至少有两人生日重复频率(P)。

二、问题分析

针对此问题,使用matlab编程,将1~365的随机数分别表示为10、30、60、90的向量,针对向量排序并统计重复数,将≥2的日期表示出来,并以向量表示,利用函数建立坐标,将每一次仿真的图像以黑色与红色叉号的形式表示在图上,重复200次,完成图像;同时,统计红色叉号与黑色叉号的数量,得出P;利用函数化主程序进行分块,得出结论。

三、编程

首先解决随机化问题,这里使用了常见的随机数函数
1
round(rand(1,h)*365);
利用plot打印黑叉。 之后,利用tabulate()函数统计出向量各值的重复情况,这里以一次模拟为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
...       ...      
353 0
354 0
355 2
356 0
357 0
358 0
359 3
360 0
361 0
362 0
363 0
364 1
取第二列大于等于2所对应的日期,标记为另一个向量,并打印,标记为红叉; 迭代200次,分块,得到最终图像,效果如下:

upload successful

可以看见,当人数大于30时,发生生日重复的概率已经超过70%,这与直觉相悖,故称“生日悖论”。

四、总结

本文针对生日悖论的实际情况进行仿真,得出以上图像,从而直观上证明了生日悖论的反直觉性。

五、参考文献

[1]https://baike.baidu.com/item/%E7%94%9F%E6%97%A5%E6%82%96%E8%AE%BA/2715290?fr=aladdin

六、附件

函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function [P] = bir(h,it,x,y,z)
cnt = 0;
subplot(x,y,z);
hold on;
for k = 1 : it,
A = round(rand(1,h)*365);
A = sort(A);
plot(k,A,'black x');
hold on;
M = tabulate(A);
X = [];
[m,n] = size(M);
for i = 1 : m,
if M(i,2) >= 2,
X = [X,M(i,1)];
end
end
aa = size(X);
if aa ~= 0
plot(k,X,'red X');
hold on;
end
if aa == 0
cnt = cnt + 1;
end
end
P = 1 - cnt / it;
title([num2str(h),'人,P=',num2str(P)]);
hold on;

主程序:

1
2
3
4
bir(10,200,2,2,1);
bir(30,200,2,2,2);
bir(60,200,2,2,3);
bir(90,200,2,2,4);

实验原图下载:
final