Симулятор броска двух игральных костей

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

То, что у меня есть до сих пор, должно генерировать случайные числа, а затем заполнять правильный элемент массива. Продолжает выводить 48 для всех операторов printf(). Есть идеи, где я ошибаюсь? Я думаю, что это в области genRand() или getTwoDieSum(). Я должен использовать следующую оболочку, я не совсем уверен, что все должно делать, поэтому я и ошибаюсь. Также я не совсем уверен, откуда берутся int lower и int upper:

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

Мой вопрос больше о том, где я ошибаюсь и откуда берутся значения int lower и int upper, и правильно ли я использую генератор случайных чисел?

Оболочка, которую необходимо использовать:

// 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 

person Patrick    schedule 15.03.2016    source источник
comment
roll никогда не меняется после приравнивания к итогу. И roll - это индекс вашего массива.   -  person BryanT    schedule 16.03.2016
comment
Как вы думаете, это хорошая идея - отключать предупреждения компилятора? Например, ваш компилятор мог сказать вам, что numberArray[roll] == numberArray[roll] + 1; не действует на соответствующую программу.   -  person EOF    schedule 16.03.2016
comment
int main( int total) Это неправильное объявление для main. Это должно быть либо int main(void), либо int main(int argc, char *argv[]). Я не знаю, что вы ожидаете от total, но вряд ли это будет работать так, как вы хотите.   -  person kaylum    schedule 16.03.2016
comment
Есть идеи, где я ошибаюсь? Я думаю, что это в области genRand() или getTwoDieSum(). Неа! Эти две функции выглядят нормально. Это ваш основной цикл, в котором кроются все проблемы.   -  person AJNeufeld    schedule 16.03.2016
comment
Пробовали ли вы установить TRIALS на 0 и посмотреть частоту отдельных бросков? Это довольно информативно... или загадочно... в зависимости от того, знаете ли вы свою таблицу ASCII или нет.   -  person AJNeufeld    schedule 16.03.2016
comment
Как мне получить значение total из getTwoDieSum() обратно в main и иметь возможность его использовать?   -  person Patrick    schedule 16.03.2016
comment
Вот для чего функция возвращает значение: int main_total = getTwoDieSum(LOWER_DIE, UPPER_DIE);   -  person kaylum    schedule 16.03.2016
comment
Хорошо, спасибо, ребята, у меня все получилось!   -  person Patrick    schedule 16.03.2016


Ответы (2)


Вы можете немного улучшить свой код. Например, функцию, вычисляющую сумму двух бросков, можно упростить:

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

Теперь, когда getTwoDieSum возвращает значение, как и genRand, вам лучше использовать его. Ваша функция main может выглядеть так:

// 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;
}

Типичный запуск дает этот результат:

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
person Bob__    schedule 16.03.2016

Используя:

int main(void) {
     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 = 0;
 int i = 0;

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

Я смог заставить его работать правильно.

person Patrick    schedule 15.03.2016
comment
Почему вы используете '0' вместо 0? Первый — это символ ascii, а второй — целое число. Использование целого числа — более правильный способ реализации счетчика. Тем более, что вы печатаете его как целое число: printf("2\t: %d\n", numberArray[2]);. - person kaylum; 16.03.2016
comment
Именно так я видел, как это делается в других примерах. - person Patrick; 16.03.2016