上机作业
(1) 假设我们班有50名同学,每个同学都报出自己的生日, 每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.0725´10-7。相重复的概率如此之大与我们主观想象不同。写一个程序,输入同学的人数n计算出其生日不重复的概率。然后在用彷真的方法, 利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
[学生的生日可以用随机数产生,rand()产生0—32767之间的伪随机数,因为此需要一个种子,种子不同产生的随机数列不同,rand()产生的随机数也不同,可以调用srand(long
int *)函数设置种子,比如我们可以获得计算机中的时间获得随机数种子, 以上函数需要包含头文件 stdlib.h]
#include "iostream"
using namespace std;
#include <math.h>
#include<ctime>
#include<stdlib.h>
bool flag;
double caculate(int, bool);
double model(int, bool);
int main()
{
int n;
cout<< "intput the number" << endl;
cin>> n;
cout<< "是否为闰年?y/n" << endl;
getchar();
if (getchar() == 'y') flag = 1;
else flag = 0;
cout<< "计算的值" << caculate(n, flag) << endl;
cout<< "模拟的值" << model(n, flag);
return 0;
}
double caculate(int num, bool flag)
{
int day;//是否为闰年,看总天数
double result = 1, i;//计算的重复概率
if (flag) day = 366;
else day = 365;
for (i = 1; i <num; i++)
{
result*= (day - i) / day;//两个人不在同一天就是(365/365)*(364/365)
}
return result;
}
double model(int num, bool flag)
{
int day;//是否为闰年,看总天数
double result;//仿真的重复概率
int cont = 0, i, j = 0;//模拟中不重复的次数
if (flag) day = 366;
else day = 365;
rand((int)time(0));
for (j = 0; j <1000000; j++)
{
int* p = new int[day+1]; //下标表示天数
for (i = 0; i < day;i++)
p[i]= 0;//清零数组
for (i = 1; i <num; i++)
{
int n;
n= rand() % day + 1;
if (!p[n])
p[n]= 1;
else
break;
}
if (i == num) cont++; //num为班级人数
delete[]p;
}
result= cont * 1.0 / 1000000;//数字越大越精确
return result;
}