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