【问题标题】:Why does the Code run on Linux but not on Windows?为什么代码可以在 Linux 上运行,但不能在 Windows 上运行?
【发布时间】: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 可以帮助您入门。

标签: c linux windows debugging


【解决方案1】:

看起来rand() 在该库中只有 16 位。通过调用两次使其成为 32 位:

int rand32() {
    return rand() ^ (rand() << 16);
}

另外,考虑使用 Bob Floyd 算法消除内部重复搜索循环:https://blog.acolyer.org/2018/01/30/a-sample-of-brilliance/

【讨论】:

  • 恩,我会考虑的,非常感谢(^.^)
  • 请注意,范围 0..32767 使用 15 位数字,而不是 16 位数字。它是 16 位有符号值范围的正数部分。显示的代码实际上只生成 30 位数字,并且第 15 位和第 31 位始终为零。当然,仅生成正数的 32 位随机数生成器将设置第 15 位而不是随机设置。
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多