统计同一天生日

蒙特卡罗方法--统计一个班级有同一天生日的同学概率

一个班有多少同学才能,至少有两个人同一天过生日(一年中的某天,不特指同年)的概率>=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 
#include 
#include 
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;
}

你可能感兴趣的:(ACM作业,算法,c++)