Почему C не вычисляет модуль правильно и, несмотря на это, результат верен? - PullRequest
0 голосов
/ 27 сентября 2019

Я учусь использовать случайную функцию (srand и rand) для запуска симуляции броска костей.Программа работает очень хорошо;Я бросаю кубик 200 раз и помещаю каждый результат в массив ветеринара.

Однако, проанализировав расчет остальной части модуля, я понял, что он вычислен неправильно.Например:

1131946436 % 6 = 2 

(вычисляется вручную и с помощью Python и с калькулятором).

модуль рассчитывается следующим образом:

1131946436 / 6 = (int) 188657739
188657739 * 6 = 1131946434
1131946436 - 1131946434 = 2

, а C даетмне 3.

Тем не менее программа работает правильно.Я думал, что это проблема переполнения int, но если вы посмотрите на результаты rand (), мы всегда под 2147483647 (предел подписи int на моем 64-битном компьютере).

Я не могу понять, почему C не делаетне правильно рассчитать модуль и, несмотря на это, программа работает правильно.

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

#define MAX_SHOTS 200
#define MAX_NUMBERS 6

int main(void) {
    int a;
    int vettore[MAX_SHOTS] = {0};

    srand((unsigned) time(NULL));

    for (int i = 0; i < MAX_SHOTS; ++i) {
        a = rand() % MAX_NUMBERS;
        vettore[i] = a;
        printf("vettore[%d] = %d - %d\n", i, a, rand());
    }

    printf("Tiro di un dado: su %d tiri è uscito:\n", MAX_SHOTS);
    for (int j = 0; j < MAX_NUMBERS; ++j) {
        printf("%d)\t", j + 1);
        int num = 0;
        for (int i = 0; i < MAX_SHOTS; ++i) {
            if (vettore[i] == j) {
                ++num;
                printf("*");
            }
        }
        printf(" (%d)\n", num);
    }

    return 0;
}

1 Ответ

0 голосов
/ 27 сентября 2019
    a = rand() % MAX_NUMBERS;
    vettore[i] = a;
    printf("vettore[%d] = %d - %d\n", i, a, rand());

Вы вызываете rand() дважды в теле этого цикла.Вызов в printf() не даст вам того же значения, которое использовалось для вычисления a.

Если вы хотите проверить результаты %, сначала присвойте rand() другой временной переменной.(Но я очень сомневаюсь, что это ваша проблема.)

...