randomize - random double c++
uniform_real_distribution Is Not Uniform (1)
Bueno, esa es la propiedad de un generador uniforme :
El 90% de los valores estarán en el orden de magnitud más alto que especifique.
Pensar más pequeño; considere el rango entero de 0 a 99 inclusive: el 90% de los dibujos tendrá 2 dígitos.
Por favor, ayúdame a entender esto. Después de ejecutar el fragmento:
random_device randomEngine;
mt19937 generatorEngine(randomEngine());
uniform_real_distribution<double> unifRandomValue(
numeric_limits<double>::min(),
numeric_limits<double>::max());
double test[1000];
for (int i{ 0 }; i < 1000; ++i) {
test[i] = unifRandomValue(generatorEngine);
}
¿Por qué cada valor generado en el rango [1.0E306, 1.8E308]
? Esperaba un valor aleatorio distribuido uniformemente desde cerca de 0 hasta el máximo de tipo doble.
¡Gracias por adelantado!
Aquí hay un ejemplo más completo:
const size_t size{ 1000 };
std::random_device randomEngine;
std::mt19937 generatorEngine(randomEngine());
std::uniform_real_distribution<double> unifRandomValue(
std::numeric_limits<double>::min(),
std::numeric_limits<double>::max());
std::array<double, size> test;
for (int i{ 0 }; i < size; ++i) {
test[i] = unifRandomValue(generatorEngine);
}
auto minMaxIt = std::minmax_element(test.begin(), test.end());
// average without overflow
double average{ 0.0 };
for (int i{ 0 }; i < size; ++i) {
average += test[i] / size;
}
std::cout << "min value : " << *minMaxIt.first << std::endl;
std::cout << "max value : " << *minMaxIt.second << std::endl;
std::cout << "average : " << average << endl;
// one possible output (they are all similar)
// min value : 1.73361e+305
// max value : 1.79661e+308
// average : 8.78467e+307