Почему Код работает в Linux, а не в Windows? - PullRequest
1 голос
/ 09 июля 2019

Ну, я написал небольшую Программу, которая должна генерировать случайные значения, но никакое значение не должно быть в выходном файле дважды.В 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;

1 Ответ

0 голосов
/ 10 июля 2019

Похоже, rand() - это всего 16 бит в этой библиотеке. Сделайте это 32 бита, вызвав его дважды:

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

Также рассмотрите возможность исключения внутреннего цикла поиска дубликатов с помощью алгоритма Боба Флойда: https://blog.acolyer.org/2018/01/30/a-sample-of-brilliance/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...