为什么C不能正确计算模量,尽管如此结果还是正确的?

问题描述 投票:0回答:1

我正在学习使用随机函数(srand和rand)进行掷骰模拟。该程序运行良好。我掷骰子200次,然后将每个结果放入vettore数组。

但是,通过分析其余模块的计算,我发现它的计算不正确。例如:

1131946436 % 6 = 2 

((用python和计算器手动计算。

模量计算如下:

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

而C给我3。

尽管该程序正常工作。我认为这是一个int溢出问题,但是如果您查看rand()的结果,我们总是低于2147483647(我的64位计算机上的int签名限制)。

我不明白为什么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;
}
c macos gcc random modulus
1个回答
0
投票
    a = rand() % MAX_NUMBERS;
    vettore[i] = a;
    printf("vettore[%d] = %d - %d\n", i, a, rand());

您在此循环的主体中两次调用rand()printf()中的调用不会为您提供用于计算a的相同值。

如果要验证%的结果,请首先将rand()分配给另一个临时变量。 (但我非常怀疑这是您的问题。)

© www.soinside.com 2019 - 2024. All rights reserved.