#include #include #include 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); }