#include
#include
#include
#include
double problem1(int n)
{
double p = 1.0;
int i;
for(i = 365;i > 365 - n;i--){
p *= (double)i / 365;
}
return 1.0 - p;
}
int problem2()
{
double min = 1.0;
double tmp;
int n;
int i;
for(i = 2;i <= 365;i++){
tmp = fabs(problem1(i) - 0.5);
if(min > tmp){
min = tmp;
n = i;
}
}
return n;
}
int issame(int day[],int n)
{
int year[365];
memset(year,0,sizeof(year));
int i;
for(i = 0;i < n;i++){
if(!year[day[i]-1]){
year[day[i]-1] = 1;
}
else{
return 1;
}
}
return 0;
}
double problem3(int n,int count)
{
int day[n];
int i,j;
double num = 0.0;
for(j = 0;j < count;j++){
for(i = 0;i < n;i++){
day[i] = rand() % 365 + 1;
}
if(issame(day,n)){
num++;
}
}
return num / count;
}
int main()
{
printf("result of problem1:%lf\n",problem1(30));
printf("result of problem2:%d\n",problem2());
printf("result of problem3:%lf\n",problem3(30,10000));
return 0;
}
理论结果:
#include
int main()
{
int i;
double p = 1;
for(i=0;i<30&&i<=365;i++)
{
p = p * (365-i)/365;
}
printf("30名学生的班级里,两个学生的生日是同一天的概率是%lf\n",1-p);
}
模拟10000次的结果:
#include
#include
#include
#define num 10000
int main(int argc, char* argv[])
{
int i,j,t,stat;
int n;
int* p;
int repeat;
if(argc>1) sscanf(argv[1],"%d",&n);
else n=30;
srand(time(0));
if(n>=365)
{
printf("%d人的测试中,存在2人同一天生日的概率是1\n",n);
}
else
{
p = (int*)malloc(sizeof(int)*n);
t = num;
stat = 0;
while(t--)
{
repeat = 0;
for(i=0;i
for(i=0;i
repeat = 1;
stat += repeat;
}
printf("%d人的测试中,存在2人同一天生日的概率是%lf\n",n,1.0*stat/num);
}
}
能等到下周一吗5555555~很想做这道题但今天得收工了
如果到时候还没人的话就归我了哈哈