假设一个班级有50名同学,每个同学都报出自己的生日, 每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.072510-7。相重复的概率如此之大与我们主观想象不同。写一个程序,输入同学的人数n,利用统计方法计算出其生日不重复的概率。然后再用彷真的方法, 利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
学生的生日可以用随机函数rand()产生,调用rand()前首先调用srand(long int *)函数设置种子,以上函数需要包含头文件 stdlib.h。
代码里这句看不懂:for(j=1;j<i&&j<=NUM;j++)
为什么要j<i这个条件?我理解i是实验次数,j是人数,应该是独立的啊?
如能再详细的讲一下仿真方法的思路就更好了,谢谢!
#include<iostream>
#include<ctime>
#define NUM 50
using namespace std;
int main()
{
int i,j;
double probability=1;
for(i=1;i<=NUM;i++)
probability=probability*((365+1-i)/365.0);
cout<<"统计方法:"<<probability;
//以下为仿真方法
int total=100000; //采样次数
int duplicateNumber=0;
int a[366]={0}; //存放生日,放于a[1]到a[365],值为1。
int temp;
srand(time(0));
for(i=1;i<=total;i++)
{
for(j=1;j<i&&j<=NUM;j++)
{
temp=rand()%365+1;
if(a[temp])
{
duplicateNumber++;break;
}
else
a[temp]=1;
}
for(j=1;j<=365;j++)
a[j]=0;
}
cout<<"仿真方法:"<<(double)(total-duplicateNumber)/total;
}
统计方法:0.0296264仿真方法:0.03033
C:\Users\USER\source\repos\test_20211203\Debug\test_20211203.exe (进程 5196)已退出,代码为 0。
按任意键关闭此窗口. . .
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。