Search code examples
crandomdicerandom-seed

Two dice rolling simulator


#pragma warning(disable:4996)
// INCLUDES
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// DEFINES
#define LOWER_DIE 1 // LOWER_DIE must be at least 1
#define UPPER_DIE 10
#define TRIALS 10000

// PROTOTYPES
int genRand(int, int);
int getTwoDieSum(int, int);
// MAIN
int main( int total) {
     int numberArray[2 * UPPER_DIE + 1] = { '0', '0', '0', '0', '0', '0', '0','0','0','0','0', '0', '0' };// holds frequency of rolls

     int roll = total;
     int i = 0;

     srand((unsigned int)time(NULL));
     for (i = 0; i < TRIALS; i++) {
          getTwoDieSum( LOWER_DIE, UPPER_DIE);
          numberArray[roll] == numberArray[roll] + 1;
     }

     printf("ROLL VALUE : FREQUENCY\n");
     printf("2\t: %d\n", numberArray[2]);
     printf("3\t: %d\n", numberArray[3]);
     printf("4\t: %d\n", numberArray[4]); 
     printf("5\t: %d\n", numberArray[5]);
     printf("6\t: %d\n", numberArray[6]);
     printf("7\t: %d\n", numberArray[7]);
     printf("8\t: %d\n", numberArray[8]);
     printf("9\t: %d\n", numberArray[9]);
     printf("10\t: %d\n", numberArray[10]);
     printf("11\t: %d\n", numberArray[11]);
     printf("12\t: %d\n", numberArray[12]);

     return 0;
}

// FUNCTION IMPLEMENTATIONS
int genRand(int lower, int upper) {
     int range = (upper - lower) + 1;
     return rand() % range + lower;

}

int getTwoDieSum( int lower, int upper) {
     int rollOne = 0;
     int rollTwo = 0;
     int total = 0;
     rollOne = genRand(lower, upper);
     rollTwo = genRand(lower, upper);
     total = rollOne + rollTwo;
     return total;
}

What I have so far, it is supposed to be generating random numbers and then populating the correct element of the array. Keeps outputting 48 for all the printf() statements. Any ideas where I am messing up? I think it is in genRand() area or getTwoDieSum(). I am required to use the following shell, I am not really sure what everything is supposed to be doing which is why I am messing up. Also I am not really sure where the int lower and int upper are coming from in:

int genRand(int lower, int upper) {
     int range = (upper - lower) + 1;
     return rand() % range + lower;
    }

My question is more of where am I messing up and where is the int lower and int upper coming from and am I using the random seed generator correctly?

Shell required to be used:

// INCLUDES
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

// DEFINES
#define LOWER_DIE 1 // LOWER_DIE must be at least 1
#define UPPER_DIE 10
#define TRIALS 10000

// PROTOTYPES
int genRand(int, int);
int getTwoDieSum();

// MAIN
int main() {
 int numberArray[2 * UPPER_DIE + 1]; // holds frequency of rolls

 // initialize numberArray

 // seed the random number generator

 // roll the dice and keep track of what was rolled in the array

 // display results

 return 0;
}

// FUNCTION IMPLEMENTATIONS
int genRand(int lower, int upper) {
 int range = (upper - lower) + 1;
 return rand() % range + lower;
}

int getTwoDieSum() {
 // YOUR IMPLEMENTATION GOES HERE 

Solution

  • You can improve your code a little bit more. For example, the function that calculates the sum of the two rolls can be simplyfied:

    int getTwoDieSum( int lower, int upper ) {
        return genRand(lower, upper) + genRand(lower, upper);   
    }
    

    Now, as getTwoDieSum returns a value, just like genRand, you'd better use it. Your main function could look like this:

    // MAIN
    int main() {
    
        // holds frequency of rolls
        int numberArray[2 * UPPER_DIE + 1] = {0};
        // The size of the array of frequency is set to 21, so that numberArray[20]
        // represents the frequency of roll 10+10.
        // The first two elements (numberArray[0] and numberArray[1]) are unused
    
        int size = sizeof(numberArray) / sizeof(int);
        int i;
        // If an array is partially initialized, elements that are not initialized
        // receive the value 0 of the appropriate type. Alternatively you can use:
        //
        // for ( i = 0; i < size; ++i ) {
        //     numberArray[i] = 0;
        // }
        // 
        // or simply
        // 
        // memset(numberArray,0,size);
    
        // seed the random number generator
        srand(time(NULL));
    
        // roll the dice and keep track of what was rolled in the array
        int roll;
        for (i = 0; i < TRIALS; i++) {
            roll = getTwoDieSum( LOWER_DIE, UPPER_DIE);
            ++numberArray[roll];
        }
    
        // display results
        printf("ROLL VALUE : FREQUENCY\n");
        for (i = 2; i < size; i++) {
            // numberArray[2] represent the frequency of roll 1+1,
            // while numberArray[20] is the frequency of roll 10+10
            printf("%d\t: %d\n", i, numberArray[i]);
            // add  ^^ the roll value
        }
    
        return 0;
    }
    

    A typical run give this output:

    ROLL VALUE : FREQUENCY
    2   : 99
    3   : 179
    4   : 273
    5   : 390
    6   : 513
    7   : 587
    8   : 678
    9   : 777
    10  : 902
    11  : 1039
    12  : 913
    13  : 822
    14  : 672
    15  : 614
    16  : 514
    17  : 433
    18  : 298
    19  : 195
    20  : 102