/*
* 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 */