Различия в выводе srand () на Windows GCC и ожидаемый выход для программирования на C? - PullRequest
0 голосов
/ 01 ноября 2018

Я хотел бы знать, почему существует разница в выводе моего компилятора gcc в Sublime Text 3 в Windows 10 и ожидаемом выводе? Если так, как я могу изменить компилятор так, чтобы он работал так же?

Это ожидаемый результат, который я могу получить при использовании https://repl.it/repls/InternalSeveralEntropy с gcc 4.6.3

The set of numbers are:

1 4 3 3 7 2 3 2 9 9 10 9 5 2 10 7 2 3 1 1 

Однако, это вывод, который я получаю, используя несколько версий gcc, 5.4.0 , 6.3.0 , 8.1.0 и даже 4.6.3 .

The set of numbers are:
2 2 8 6 8 2 3 8 4 6 10 5 9 2 8 10 7 2 1 6

Я попытался найти, и самое близкое, что я понял, это то, что он имеет отношение к srand (), работающему по-другому? Ниже приведен мой код.

    #include <stdio.h>

    #include <stdlib.h>

    int main(void) {

    int N = 20, DATA[20];

    int i; //< you local variables here >

    srand(454646); //don't change this line! Will be used in autograding... You may fail test cases if change this

    for (i = 0; i < N; i++){        //< generate rand numbers and store here in DATA array >
        DATA[i] = rand()%10 + 1;
    }

    printf("The set of numbers are:\n");
    for (i = 0; i < N; i++){
        printf("%d ", DATA[i]);
    }
    printf("\n");

    //< write using FOR loops to determine MODE and print >

    return 0;

}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Из стандарта C11:

7.22.2.1 Функция ранда

... Сноска. Нет никаких гарантий относительно качества полученной случайной последовательности, и известно, что некоторые реализации производят последовательности с ужасающе неслучайными битами младшего разряда. Приложения с особыми требованиями должны использовать генератор, который, как известно, достаточен для их нужд.

Эта цитата проясняет, что rand и srand определяются реализацией, а последовательность программы (используемая для оценки!) Также определяется реализацией.

0 голосов
/ 01 ноября 2018

Как упоминается в части 7.22.2.1 стандарта C11, вывод функции rand() определяется реализацией, поэтому он может меняться в зависимости от каждой реализации (или даже версии компилятора).

Единственное, что гарантировано, это:

Возвращает псевдослучайное целое значение от 0 до RAND_MAX (от 0 до RAND_MAX включен).

Это означает, что даже равномерное распределение тоже не гарантируется.

Если вам нужен генератор сгенерированных псевдослучайных чисел, который гарантированно будет постоянно создавать одну и ту же последовательность (для каждого начального числа), вам нужно написать эту функцию самостоятельно. Одним из способов написания такой функции является использование LFSR , или вы можете проверить реализацию функции rand() для конкретной версии и добавить ее в свой код как случайную функцию, специфичную для вашего приложения, такую ​​как myrand().

...