values randomize number generate funcion float example and c++ random

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