Как установить результат rand() для значений в определенном диапазоне, включая отрицательные значения?

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

Прямо сейчас я могу только понять, как установить числа 0 - макс.

Вот что у меня есть до сих пор:

double *random_arr(int size, double min, double max) {
    double *array0 = calloc(size, sizeof(double));
    if (array0 == NULL) {
            exit(1);
    }
    for (int i = 0; i < size; i++)
            array0[i] = (max * rand() / RAND_MAX);
    return array0;
}

Мое лучшее предположение:

for (int i = 0; i < size; i++)
    array0[i]=((max + min) * rand() / RAND_MAX) - min;

person randon87    schedule 07.05.2013    source источник


Ответы (2)


Диапазон должен быть (max-min), и вы можете предварительно рассчитать коэффициент умножения, разделив его на RAND_MAX.

double factor = (max - min) / RAND_MAX;
for (int i = 0; i < size; i++)
    array0[i] = (rand() * factor) + min;
person Thomas W    schedule 07.05.2013

Предполагая, что rand() возвращает число с плавающей запятой 0‹=x‹1, вам просто нужно масштабировать диапазон желаемых чисел, а затем добавить минимум.

Пример: нам нужны числа от -100 до -10

Ваш диапазон - это ваш максимум - минимум, который равен -10 - (-100) = 90.

Предположим, ваше случайное число равно 0,5.

0,5 * 90 + -100 (ваш минимум) = -55

Давайте проверим крайние случаи:

случайное число = 0,0

0.0 * 90 + -100 = -100

случайное число = 0,9999999999...

0.99999999... * 90 + -100 = -10

Большой!

person user1897691    schedule 07.05.2013