Чтобы получить случайное значение double
в диапазоне [-DBL_MAX ....DBL_MAX]
с примерно равным шансом любого появления double
, случайным образом заполните double
. Отклонить не конечные.
#include <math.h>
#include <stdlib.h>
double rand_finite_double(void) {
union {
double d;
unsigned char uc[sizeof(double)];
} u;
do {
for (unsigned i = 0; i < sizeof u.uc; i++) {
u.uc[i] = (unsigned char) rand();
}
} while (!isfinite(u.d));
return u.d;
}
Несколько линейно неэффективно, учитывая, что каждая итерация цикла обычно генерирует только 8 битов.