#include #include #include #define POPULATION 40000 #define PREVALENCE 0.0005 // 0.05% della popolazione è realmente malata #define SENSITIVITY 0.95 // 95% di probabilità di identificare correttamente un malato #define FALSE_POS_RATE 0.05 // 5% di probabilità di falsi positivi nei sani #define NCITIES 1000 // eseguiamo la simulazione 1000 volte // funzione di supporto: restituisce una probabilità casuale tra 0.0 e 1.0 double random_probability() { return (double)rand() / (double)RAND_MAX; } int main() { srand((unsigned int)time(NULL)); // inizializziamo il generatore di numeri casuali long tot_true_positives = 0; long tot_false_positives = 0; long tot_sick = 0; printf("Simulazione di %d citta' con %d abitanti ciascuna...\n\n", NCITIES, POPULATION); for (int city = 0; city < NCITIES; city++) { for (int citizen = 0; citizen < POPULATION; citizen++) { // il cittadino è realmente malato? int is_sick = 0; if (random_probability() <= PREVALENCE) { is_sick = 1; tot_sick++; } // Somministriamo il test diagnostico if (is_sick) { // il test ci azzecca if (random_probability() <= SENSITIVITY) tot_true_positives++; } else { // il test sbaglia if (random_probability() <= FALSE_POS_RATE) tot_false_positives++; } } } // calcoliamo i risultati long tot_positives = tot_true_positives + tot_false_positives; // probabilità empirica: P(malato | positivo) double prob = (double)tot_true_positives / tot_positives * 100.0; printf("RISULTATI MEDI PER CITTA' (%d abitanti):\n",POPULATION); printf(" Abitanti realmente malati: %ld\n", tot_sick / NCITIES); printf(" VERI positivi trovati: %ld\n", tot_true_positives / NCITIES); printf(" FALSI positivi trovati: %ld\n", tot_false_positives / NCITIES); printf(" Totale dei test positivi: %ld\n\n", tot_positives / NCITIES); printf("Se il test è positivo, la probabilita' di essere malati e': %.2f%%\n", prob); return 0; }