разъяснение для RAND_MAX и rand () в c stdlib.h - PullRequest
0 голосов
/ 28 августа 2018

почему следующий код c выдает действительные числа только в диапазоне от 0 до 1 (например, 0,840188,0,394383 ... и т. Д.) Для double a,b, когда значение для RAND_MAX представляется равным 0.000000. Разве RAND_MAX не должен устанавливать максимальное значение для числа, генерируемого функцией rand()?

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {

    double a,b,c;
    for (int i=0;i<100;i++){
    a=(double)rand()/(double)RAND_MAX;
    b=(double)rand()/(double)RAND_MAX;
    c=a-b;
    printf("itteration : %d values a=%f,b=%f,c=%f, RAND_MAX=%f \n",i,a,b,c,RAND_MAX);
    }  
    return 0;
    }

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

... значение для RAND_MAX составляет 0,000000.

Вы печатаете целое число, используя спецификатор для двойного числа. Это неопределенное поведение.

Из стандарта C99 (N1256).

7.19.6.3 Функция printf
...
2. Функция printf эквивалентна fprintf с вставленным аргументом stdout перед аргументами для printf.

7.19.6.1 Функция fprintf
....
9. Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент неправильный тип для соответствующей спецификации преобразования, поведение не определено.

Так что печатает 0.000 для RAND_MAX. Ваш другой вопрос:

Разве RAND_MAX не должен устанавливать максимальное значение для числа, генерируемого функцией rand ()?

rand() возвращает псевдослучайное число в диапазоне от 0 до RAND_MAX. RAND_MAX - это константа, значение которой по умолчанию может отличаться в разных реализациях, но ее значение должно быть не менее 32767.

Но при делении с плавающей запятой rand() на RAND_MAX будет получено значение от 0 до 1.

0 голосов
/ 28 августа 2018

RAND_MAX является интегральной константой, но вы печатаете ее, используя спецификатор %f (используется для double), который является неопределенным поведением (и в вашем случае выдает 0). Используйте %d, и вы увидите фактическое значение RAND_MAX.

Кстати, любой порядочный компилятор предупредит вас об этом недействительном printf, если вы включите предупреждения достаточно высоко. Убедитесь в том, что C и C ++ полны ловушек, по крайней мере, позвольте компилятору помочь вам, когда это возможно.

...