2022_Giugno_2.c (download)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int roll(int dices[3][6], int coppia, int *res_dado_1, int *res_dado_2);
void print_esito(int n_lancio, int res, int coppia, int res_dado_1, int res_dado_2);
int main() {
    srand48(time(NULL));
    
    int dices[3][6] = {
        {3, 3, 3, 3, 3, 6},
        {2, 2, 2, 5, 5, 5},
        {1, 4, 4, 4, 4, 4}
    };
    
    int N_rolls, i, coppia, res_1, res_2, histo_index;    
    double histo[3];
    
    FILE *out = fopen("histo.dat", "w");
    for(N_rolls = 10, histo_index = 0; N_rolls <= 100000; N_rolls *= 10, histo_index++) {
        for(i = 0; i < N_rolls; i++) {
            for(coppia = 0; coppia < 3; coppia++) {
                int res = roll(dices, coppia, &res_1, &res_2);
                if(coppia == 0 && res == 0) {
                    histo[0]++;
                }
                else if(coppia == 1 && res == 1) {
                    histo[1]++;
                }
                else if(coppia == 2 && res == 2) {
                    histo[2]++;
                }
                
                if(i < 5) {
                    print_esito(i + 1, res, coppia, res_1, res_2);
                }
            }
        }
        
        // normalizzazione e stampa dell'istogramma
        fprintf(out, "%d", N_rolls);
        for(coppia = 0; coppia < 3; coppia++) {
            histo[coppia] /= N_rolls;
            fprintf(out, " %lf", histo[coppia]);
        }
        fprintf(out, "\n");
    }
    fclose(out);
    
    return 0;
}
int roll(int dices[3][6], int coppia, int *res_dado_1, int *res_dado_2) {
    int dado_1, dado_2;
    if(coppia == 0) {
        dado_1 = 0;
        dado_2 = 1;
    }
    else if(coppia == 1) {
        dado_1 = 1;
        dado_2 = 2;
    }
    else {
        dado_1 = 2;
        dado_2 = 0;
    }
    
    *res_dado_1 = dices[dado_1][lrand48() % 6];
    *res_dado_2 = dices[dado_2][lrand48() % 6];
    
    if(*res_dado_1 > *res_dado_2) {
        return dado_1;
    }
    else {
        return dado_2;
    }
}
void print_esito(int n_lancio, int res, int coppia, int res_dado_1, int res_dado_2) {
    char nome_dado_1, nome_dado_2, nome_vincitore;
    if(coppia == 0) {
        nome_dado_1 = 'A';
        nome_dado_2 = 'B';
    }
    else if(coppia == 1) {
        nome_dado_1 = 'B';
        nome_dado_2 = 'C';
    }
    else {
        nome_dado_1 = 'C';
        nome_dado_2 = 'A';
    }
    
    if(res == 0) {
        nome_vincitore = 'A';
    }
    else if(res == 1) {
        nome_vincitore = 'B';
    }
    else {
        nome_vincitore = 'C';
    }
    
    fprintf(stdout, "Lancio n. %d, dado %c = %d, dado %c = %d, vince il dado %c\n", n_lancio, nome_dado_1, res_dado_1, nome_dado_2, res_dado_2, nome_vincitore);
}