|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <math.h>
|
|
|
|
#define NPMIN 3
|
|
#define NPMAX 50
|
|
#define TRIES 10000
|
|
|
|
void genera_compleanni(int compleanni[NPMAX], int N);
|
|
int controlla_compleanni(int compleanni[NPMAX], int N);
|
|
void salva_frequenze(double prob[NPMAX - NPMIN + 1]);
|
|
double prob_teorica(int N);
|
|
|
|
int main() {
|
|
srand48(time(NULL));
|
|
int compleanni[NPMAX];
|
|
double prob[NPMAX - NPMIN + 1];
|
|
int N, i;
|
|
|
|
for(N = NPMIN; N <= NPMAX; N++) {
|
|
for(i = 0; i < TRIES; i++) {
|
|
genera_compleanni(compleanni, N);
|
|
prob[N - NPMIN] += controlla_compleanni(compleanni, N);
|
|
}
|
|
prob[N - NPMIN] /= TRIES;
|
|
double delta_PN = sqrt(prob[N - NPMIN] * (1 - prob[N - NPMIN]) / N);
|
|
|
|
printf("Gruppo di %2d persone: P = %.3lf +- %.2lf%% (con %d gruppi simulati)\n", N, prob[N - NPMIN], delta_PN, TRIES);
|
|
|
|
}
|
|
|
|
salva_frequenze(prob);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void genera_compleanni(int compleanni[NPMAX], int N) {
|
|
int i;
|
|
for(i = 0; i < N; i++) {
|
|
compleanni[i] = drand48() * 365 + 1;
|
|
}
|
|
}
|
|
|
|
int controlla_compleanni(int compleanni[NPMAX], int N) {
|
|
int i, j;
|
|
for(i = 0; i < N; i++) {
|
|
for(j = i + 1; j < N; j++) {
|
|
if(compleanni[i] == compleanni[j]) {
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
double prob_teorica(int N) {
|
|
double log_365_fact = 0;
|
|
double log_365_N_fact = 0;
|
|
int i;
|
|
|
|
for(i = 1; i <= 365; i++) {
|
|
log_365_fact += log(i);
|
|
if(i <= (365 - N)) {
|
|
log_365_N_fact += log(i);
|
|
}
|
|
}
|
|
|
|
return 1.0 - exp(log_365_fact - log_365_N_fact - N * log(365.0));
|
|
}
|
|
|
|
void salva_frequenze(double prob[NPMAX - NPMIN + 1]) {
|
|
int i;
|
|
FILE *output = fopen("compleanno_2P.dat", "w");
|
|
|
|
for(i = 0; i < (NPMAX - NPMIN + 1); i++) {
|
|
int N = i + NPMIN;
|
|
double PN_th = prob_teorica(N);
|
|
fprintf(output, "%d %lf %lf\n", N, prob[i], PN_th);
|
|
}
|
|
|
|
fclose(output);
|
|
}
|