为什么 C 不能正确计算模数,尽管如此结果是正确的?
Why does C not calculate the modulus correctly and despite this the result is correct?
我正在学习使用随机函数(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;
}
a = rand() % MAX_NUMBERS;
vettore[i] = a;
printf("vettore[%d] = %d - %d\n", i, a, rand());
您在此循环体中调用了两次 rand()
。 printf()
中的调用不会为您提供用于计算 a
.
的相同值
如果要验证%
的结果,请先将rand()
赋值给另一个临时变量。 (但我很怀疑这是不是你的问题。)
我正在学习使用随机函数(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;
}
a = rand() % MAX_NUMBERS;
vettore[i] = a;
printf("vettore[%d] = %d - %d\n", i, a, rand());
您在此循环体中调用了两次 rand()
。 printf()
中的调用不会为您提供用于计算 a
.
如果要验证%
的结果,请先将rand()
赋值给另一个临时变量。 (但我很怀疑这是不是你的问题。)