2015-11-23 1 views
-1

L'intention ici est d'écrire un code C pour un simulateur de roulage à 2 dés. Il doit écrire la réponse sous forme d'histogramme (10 résultats par ligne). Calculer et donner le minimum, le maximum et la moyenne des jets de dés. Ainsi que les doublons. Je dois admettre que je suis coincé en ce moment. Toute aide serait appréciée.C - Simulateur de roulage de dés

Voici le code:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#define N 100 

void initarray(int d[]); 
void printarray(int d[]); 
void printstar(int n); 
void fancyprint(int d[]); 
int roll(void); 

int main(int argc, char* argv[]) { 
{ 
    int roll(); 
    int d[13]; /* 2-12 hold num of rolls */ 
    int i;  /* variable de la boucle */ 
    int starttime = time(NULL); /* temps horloge*/ 
    srand(1020); 

    printf("Simulation de 100 lancees de 2 des"); 

    for (i = 0; i < N; i++) 
     d[roll() + roll()]++; 
    printarray(d); 
    fancyprint(d); 
    printf("Elapsed time: %ld seconds\n", 
     time(NULL) - starttime); 
    return 0; 
} 

/* initarray: initialize statistic array */ 
void initarray(int d[]){ 
    int i; 
    for (i = 2; i < 13; i++) 
     d[i] = 0; 
} 

/* printarray: print each num of rolls */ 
void printarray(int d[]){ 
    int i; 
    double e[] = {0, 0, 
     1.0/36.0, 2.0/36.0, 3.0/36.0, 4.0/36.0, 
     5.0/36.0, 6.0/36.0, 5.0/36.0, 4.0/36.0, 
     3.0/36.0, 2.0/36.0, 1.0/36.0}; 
    printf("Sum Times Frequency"); 
    printf("  Exact Diff\n\n"); 
    for (i = 2; i < 13; i++) 
     printf("%2d %7d %11.7f %10.7f %8.4f\n", 
     i, 
     d[i], 
     (double)d[i]/N*100.0, 

     e[i]*100.0, 
     ((double)(d[i]) - 
      e[i]*N)/N*100.0); 
} 

/* printstar: print n stars */ 
void printstar(int n) { 
    while (n > 0) { 
     printf("*"); 
     n--; 
    } 
} 


/* fancyprint: print bar graph */ 
void fancyprint(int d[]){ 
    int i; 
    printf("\n"); 
    for (i = 2; i < 13; i++) { 
     printf("Sum:%3d |", i); 

     printstar(300*d[i]/N); 

     printf("\n"); 
    } 
    printf("\n"); 
} 

/* roll: simulate rolling a die */ 
int roll() { 
    return (int) (6.0*(rand()/(double)RAND_MAX) 
     + 1.0); 

return 0; 
} 
} 

Répondre

0

OP de roll() génère un 7 temps en temps: quand rand() == RAND_MAX.

int roll(void) { 
    // return (int) (6.0*(rand()/(double)RAND_MAX) + 1.0); 
    return (int) (6.0*(rand()/((double)RAND_MAX + 1) + 1.0); 
} 

ci-dessus aura des problèmes si (double)RAND_MAX n'est pas exact.

Il a également encore un petit biais.

Envisagez d'autres approches n'utilisant pas de virgule flottante. Tels que: https://stackoverflow.com/a/17554531/2410359

Autres problèmes possibles.

+0

Merci, je vais essayer ça. – mmmtv

+0

Le '+ 1.0' devrait probablement être' + 1' après le cast –

+0

@MM Pourrait faire cela, Encore mieux est '((double) (RAND_MAX/2 + 1) * 2.0)' car 'RAND_MAX' est certainement un pouvoir -of-2 - 1' et la conversion de 'RAND_MAX/2 + 1' en' double' sera certainement exacte. Plus encore, je signalais à OP que faire tout cela sans FP est vraiment la meilleure voie à suivre. – chux