/* * dado.c * Simulazione di un dado ideale e di un dado truccato; in entrambi i casi * calcola le frequenze assolute dei risultati e le confronta con la * frequenza attesa * - inizializzazione: seme random, acquisizione numero di esperimenti, * azzeramento conteggi * - esegue n volte l'esperimento del dado ideale e rileva le frequenze dei * risultati * - visualizza i risultati * - azzera il conteggio delle frequenze, calcola le probabilita' cumulate * - esegue n volte l'esperimento del dado truccato e rileva le frequenze * dei risultati * - visualizza i risultati */ #include <stdlib.h> #include <stdio.h> #include <math.h> #define DIMBUF 80 #define NFACCE 6 int dado(); int dadoTruccato(double *prob); /* * main ***************************************************************** */ int main(){ long ris[NFACCE]; double probFacce[NFACCE]={0.2,0.16,0.16,0.16,0.16,0.16}; /* inizializza con probabilita' delle facce */ int i,n,ch; float media; char linea[DIMBUF]; srand(1); /* assegna il seme iniz. per ripetere lo stesso esperimento */ printf("\nNumero esperimenti "); fgets(linea,DIMBUF,stdin); sscanf(linea,"%d",&n); for (i=0;i<NFACCE;i++) ris[i]=0; /* azzera conteggio risultati */ for (i=0;i<n;i++){ ris[dado()]++; } media=0; for (i=0;i<NFACCE;i++) media+=ris[i]; media/=NFACCE; printf("Valore medio teorico:%f\teffettivo:%f\n",(float)n/NFACCE,media); for (i=0;i<NFACCE;i++) printf("%d: %ld %f\n",i+1,ris[i],(float)(ris[i]-media)/media*100); /* dado truccato */ for (i=1;i<NFACCE;i++) probFacce[i]+=probFacce[i-1]; /* trasforma probabilita' in cumulate; il primo non si cambia */ for (i=0;i<NFACCE;i++) ris[i]=0; /* azzera conteggio risultati */ for (i=0;i<n;i++){ ris[dadoTruccato(probFacce)]++; } media=0; for (i=0;i<NFACCE;i++) media+=ris[i]; media/=NFACCE; printf("Valore medio teorico:%f\teffettivo:%f\n",(float)n/NFACCE,media); for (i=0;i<NFACCE;i++) printf("%d: %ld %f\n",i+1,ris[i],(float)(ris[i]-media)/media*100); ch = getchar(); return 0; } /* end main */ /* * dado *************************************************************** */ int dado(void){ return NFACCE*(double)rand()/RAND_MAX; } /* end dado */ /* * dado truccato ***************************************************** */ int dadoTruccato(double *prob){ double r; int i=0; r = (double)rand()/RAND_MAX; while (r>prob[i] && r<NFACCE-1) i++; return i; } /* end dadoTruccato */