蒙特卡罗方法--统计一个班级有同一天生日的同学概率
一个班有多少同学才能,至少有两个人同一天过生日(一年中的某天,不特指同年)的概率>=50%.
分析:
假设一个班有N个人,让每班人数N从10人开始到80人观察同日生机率的变化
每次模拟出10000个班,看有多少个有同一天生日的班,计算频率。
数据结构:
定义一个数组stu[367]保存学生的生日。
每个同学的生日stu[i]的值属于1-365的某个随机值,均匀分布。
算法:
每次模拟出10000个班,
在这10000个班级中,首先给每班的若干人随机生成生日。
再判断该班级中,是否有同一天过生日的。
算法:
判断该 班中是否有同一天过生日的同学,要求用一个函数实现int HaveSameBirthday (int stu[] ,int n){ }
形参n表示每班人数。
该函数中,循环遍历所有同学是否和其他同学是同一天过生日,即stu[i]j是否等于stu[j]。
如果有同一天生日的,返回1,否则返回0。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int HaveSameBirthday(int stu[], int n);
int main()
{
int Class, N = 10, i;
float sum;
int stu[367]; //个人认为定义成81就够了
srand((unsigned)time(NULL));
for (int N = 10; N <= 80; N++) //每班人数从10人到80人一级一级增加
{
sum = 0;
for (Class = 1; Class <= 10000; Class++) //每次假定好人数后模拟10000个班级
{
stu[365] = { 0 };
for (i = 1; i <= N; i++) //每个班级中随机生成每个人的生日情况
{
stu[i]=rand()%365+1;
}
if (HaveSameBirthday(stu, N))sum++; //有至少两个人同一天生日的班级,sum++
}
cout << "每班人数为 " << N << " 人时,有至少两人同一天生日的班级的概率为 " << sum/10000*100<<"%" << endl;
}
return 0;
}
int HaveSameBirthday(int stu[], int n)
{
int i, j,k;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
if (i != j)
{
if (stu[i] == stu[j])
{
k = 1; break;
}
else k = 0;
}
}
if (k == 1)break;
}
return k;
}