好吧,我编写了一个小程序,该程序应该生成随机值,但是在输出文件中两次都不应该有任何值。 在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;
}
发布了所有内容,但是发布了输出,因为我真的不知道问题出在哪里,我想您将需要最多的内容来重现我的问题。 如果您对其进行了编译,请使用诸如50000之类的命令通过cmd运行它,以使其高于32768。
(例如:example.exe 50000)
预期的是,它将创建一个名为RanGen.txt的文件,该文件具有200000个随机值(200000是我的测试值)
但是在文本Document中输出的是32767个值,然后程序仅执行了其他操作。
解决方案:使用rand() % 214748346;
代替rand() % (214748346 - 1 + 1) + 1;
答案 0 :(得分:0)
类似rand()
的那个库中只有16位。通过两次调用使其变为32位:
int rand32() {
return rand() ^ (rand() << 16);
}
另外,考虑使用Bob Floyd的算法https://blog.acolyer.org/2018/01/30/a-sample-of-brilliance/
消除内部重复搜索循环