Правила приоритета. Проблемы с использованием скобок и деления с помощью srand для получения числа с плавающей запятой.

Я пытаюсь манипулировать srand, чтобы srand возвращал десятичное число при делении. Но это не работает. Мой код не возвращает десятичное число, хотя правила приоритета должны отдавать приоритет скобкам перед делением.

#include <stdio.h>
#include <math.h>

int main(void) {

    double save;

    srand(time(NULL));

    save = (rand() % 100)/ 10;

    printf("%f", save);

    return 0;
}

Однако этот код работает нормально, но я не доволен решением.

#include <stdio.h>
#include <math.h>

int main(void) {

    double save;

    srand(time(NULL));

    save = rand() % 100;

    save = save / 10;

    printf("%f", save);

    return 0;
}

Может ли кто-нибудь объяснить это и дать лучшее решение?


person user2874149    schedule 12.10.2013    source источник


Ответы (2)


Проблема этого кода:

double save;
save = (rand() % 100) / 10;

не в приоритете операторов, а из-за деления на целочисленную константу 10. Пытаться:

save = (rand() % 100) / 10.0;

но если вы хотите сгенерировать числа из интервала <0; 10), лучше сделать:

save = ((double)rand() / ((double)RAND_MAX + 1.0)) * 10.0;

что даст более точные результаты, которые также будут более равномерно распределены :)

person LihO    schedule 12.10.2013
comment
Благодарю вас! это многое объясняет! но... не могли бы вы объяснить, почему save = ((double)rand() / ((double)RAND_MAX + 1.0)) * 9.9; лучше, чем, например, save = ((double)rand() / ((double)RAND_MAX)) * 10; - person user2874149; 12.10.2013
comment
То есть, если я ищу число, то есть 0 ‹= число ‹=10, а не 0 ‹ число ‹ 10, - person user2874149; 12.10.2013
comment
@EricPostpischil: Что заставляет вас думать, что уменьшение масштаба с использованием RAND_MAX + 1.0 приводит к менее равномерному распределению, чем % ? - person LihO; 12.10.2013
comment
@EricPostpischil: А, да. Вы правы с этим умножением на 9.9, оно действительно должно быть 10.0. - person LihO; 12.10.2013

Это не имеет никакого отношения к приоритету оператора!
rand() возвращает тип int, и его деление на целое число также возвращает значение int. Вы должны разыграть (rand() % 100)/ 10 в double

save = (double) (rand() % 100)/ 10;  

Во втором случае

save = rand() % 100;

продвигает значение, полученное rand() % 100, до double. И тогда, разделив save на 10, вы получите правильный ответ, то есть double.

person haccks    schedule 12.10.2013