【发布时间】:2019-07-09 20:49:25
【问题描述】:
好吧,我写了一个应该生成随机值的小程序,但输出文件中不应该有两次值。 在 Linux 上它运行得很好,但在 Windows 上它只是在第 32768 个值上运行无穷长。 这意味着,该 cmd 是打开的,但从那时起没有真正发生任何事情。
到现在我已经调试了 30 次,但它从来没有出现过任何问题(调试它真是太糟糕了) 我写了新的,重新编译了它,甚至改变了它下面的值是通过调试器运行的
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int intlen(int[]);
int main(int argc, char *argv[]) {
FILE *fp;
int percent = 0;
int Ergebnis = 0, length = 0, lenNow = 0;
bool proof = true;
srand(time(NULL));
fp = fopen("ranGen.txt", "w");
length = atoi(argv[1]);
int Lookup[length];
for (int x = 0; x < length; x++){
Lookup[x] = 0;
}
for (int i = 0; i < length; i++) {
do {
proof = true;
Ergebnis = rand() % (2147483646 - 1 + 1) + 1;
for (int j = 0; j < length && Lookup[j] != 0 && proof != false; j++) {
if (Ergebnis == Lookup[j]) {
proof = false;
}
}
}while(proof == false);
Lookup[lenNow] = Ergebnis;
lenNow++;
fprintf(fp,"%i ",Ergebnis);
}
return 0;
}
发布了所有内容,但输出是因为我真的不知道问题出在哪里,我认为您将需要大部分内容来重现我的问题。 如果你编译它,通过 cmd 运行它,类似 50000,使其高于 32768。
(像这样:example.exe 50000)
预计它将创建一个名为 RanGen.txt 的文件,其中包含 200000 个随机值(200000 是我的测试值)
但输出是文本文档中的 32767 个值,然后程序什么也没做。
解决方案:使用rand() % 214748346; 而不是rand() % (214748346 - 1 + 1) + 1;
【问题讨论】:
-
您希望
Ergebnis的范围是多少?你应该检查你的RAND_MAX是什么。 -
RAND_MAX在您在 Windows 上使用的 C 库中是 32,767,因此rand() % (2147483646 - 1 + 1) + 1将生成介于 1 和 32,768 之间的数字,因此您的do循环将永远重复,因为您'告诉它。 -
rand()的替代品是什么?如果我能在 Linux 和 Windows 上使用它会很棒 -
RAND_MAX是 在 Linux 和 Windows 上。这是标准的。但它可能有不同的值。 -
@Diamond:您需要使用不同的随机数生成器。 This question 可以帮助您入门。