Как уже отмечали другие, любые попытки просто преобразовать диапазон функции 'rand ()' из [0, RAND_MAX] в желаемый [-1, +1] приведут к генератору случайных чисел, который может генерировать только дискретноенабор значений с плавающей точкой.Для генератора с плавающей запятой плотность этих значений может быть недостаточной в некоторых приложениях (если значение RAND_MAX, определяемое реализацией, недостаточно велико).Если это проблема, можно увеличить экспоненциальную плотность выше экспоненциально, используя два или более вызовов rand () вместо одного.
Например, комбинируя результаты двух последовательных вызовов к rand ()'можно получить псевдослучайное число в диапазоне [0, (RAND_MAX + 1) ^ 2 - 1]
#define RAND_MAX2 ((RAND_MAX + 1ul) * (RAND_MAX + 1) - 1)
unsigned long r2 = (unsigned long) rand() * (RAND_MAX + 1) + rand();
, а затем использовать тот же метод для преобразования его в число с плавающей точкой в [-1, +1] range
double dr2 = r2 * 2.0 / RAND_MAX2 - 1;
Используя этот метод, можно накапливать столько вызовов rand (), сколько необходимо, конечно, следя за целочисленным переполнением.
В качестве примечания: этот метод объединения последовательных вызовов 'rand ()' не дает генераторов псевдослучайных чисел очень высокого качества, но может отлично работать во многих целях.