【发布时间】:2014-09-29 18:15:23
【问题描述】:
我有这个代码。当我编译并执行它时,没有显示错误,但是,从第 50 个元素到最后一个元素,值超出了 rand() 的区间(我认为,从 0 到 32767)。这是非常出乎意料的,因为程序继续运行而没有显示任何写入错误消息。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define MAX 100
using namespace std;
struct num {
int val;
};
int main() {
FILE *f, *g;
num data[MAX];
f = fopen("file1.txt", "w");
if(f == NULL) {
printf("Error\n");
exit(0);
} else {
for(int i = 0; i < MAX; i++) {
data[i].val = rand();
}
fwrite(data, sizeof(num), MAX, f);
if(ferror(f)) {
exit(0);
}
fclose(f);
}
num data1[MAX];
g = fopen("file1.txt", "r");
if(g == NULL) {
exit(0);
} else {
fread(data1, sizeof(num), MAX, g);
if(ferror(g)) {
printf("Error\n");
exit(0);
}
fclose(g);
for(int i = 0; i < MAX; i++) {
printf("val %d : %d\n", i+1, data1[i].val );
}
}
}
【问题讨论】:
-
rand的范围是0到RAND_MAX,可能是也可能不是32767。你应该检查它是什么。 -
您似乎在这里使用了混合 C/C++ 方案,我建议您选择一个并坚持使用它。另外,当您打印出
RAND_MAX时会发生什么?它并不总是 32767,因此您的代码可能完全按照指定的方式执行。 -
这个程序应该如何给出写错误信息?
-
“我认为是从 0 到 32767” - 它肯定是零到某事。
std::cout << RAND_MAX << '\n';在您的程序开始时将消除您可能隐藏的任何不确定性。更好的问题是,如果您正在寻找从 something-to-something-else 的均匀随机分布,为什么不使用<random>及其所有美味,尤其是 @987654322 @。为什么这被标记为[c]?它显然有 C++ 工件。 -
我运行了你的代码,输出看起来没什么奇怪的,除了它总是一样的。您需要播种 rand(),最常见的方法是包含 time.h 并调用
srand( time(0) )作为main的第一行。