Разъяснение для 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 в двоичном формате показывают вам в десятичном виде.