#include #include #include #include #define BITS 8 void somma(int* A, int* B, int* ApB) { int i; int S, riporto = 0; for(i = 0; i < BITS; i++) { S = A[i] + B[i] + riporto; if (S > 1) { riporto = 1; S = S - 2; } else { riporto = 0; } ApB[i] = S; } } void genera_numero(int N[BITS]) { int i; N[BITS - 1] = 0; for(i = 0; i < BITS - 1; i++) { N[i] = drand48() > 0.5 ? 1:0; } } int converti_numero(int *N) { int S = 0, i; for(i = 0; i < BITS; i++) { S += ((int)pow(2,i)) * N[i]; } return S; } void inserimento(int *nsum) { int fine, ret; do { fine = 1; printf("Immetti il numero di somme da effettuare: "); ret = scanf("%d", nsum); if(*nsum < 1 || ret == 0) { fine = 0; } } while(!fine); } int main(void) { int i, sum[BITS], nsum; int A[BITS] = {0}, B[BITS] = {0}; int numA, numB, hist[255] = {0}; srand48(time(NULL)); FILE *f = fopen("frequenze.dat", "w"); if(f == NULL) { printf("errore nell'apertura del file\n"); exit(1); } inserimento(&nsum); for(i = 0; i < nsum; i++) { genera_numero(A); genera_numero(B); somma(A, B, sum); //numA = converti_numero(A); //numB = converti_numero(B); int ApB = converti_numero(sum); //printf("numA=%d numB=%d somma=%d\n", numA, numB, ApB); hist[ApB]++; } for(i = 0; i < 255; i++) { fprintf(f, "%d %.5f\n", i, hist[i] / (double)nsum); } fclose(f); return 0; }