Разъяснение для RAND_MAX и rand() в c stdlib.h

Почему следующий код 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;
    }

3 ответа

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

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

... значение для 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,

RAND_MAX — это целое число, и когда вы печатаете его с помощью %f, в двоичном формате оно усекается. На самом деле 0 - это то, что последние несколько чисел RAND_MAX в двоичном формате показывают вам в десятичном виде.

Другие вопросы по тегам