Genere números aleatorios usando la biblioteca aleatoria C ++ 11
Como sugiere el título, estoy intentando encontrar una manera de generar números aleatorios usando la nueva <random>
biblioteca C++11. Lo he probado con este código:
std::default_random_engine generator;
std::uniform_real_distribution<double> uniform_distance(1, 10.001);
El problema con el código que tengo es que cada vez que lo compilo y ejecuto siempre genera los mismos números. Entonces mi pregunta es ¿qué otras funciones en la biblioteca aleatoria pueden lograr esto siendo verdaderamente aleatorias?
Para mi caso de uso particular, estaba intentando obtener un valor dentro del rango[1, 10]
Stephan T. Lavavej(stl) de Microsoft dio una charla en Going Native sobre cómo usar las nuevas funciones aleatorias de C++11 y por qué no usarlas rand()
. En él, incluyó una diapositiva que básicamente resuelve tu pregunta. Copié el código de esa diapositiva a continuación.
Puedes ver su charla completa aquí :
#include <random>
#include <iostream>
int main() {
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(1.0, 10.0);
for (int i=0; i<16; ++i)
std::cout << dist(mt) << "\n";
}
Usamos random_device
once para inicializar el generador de números aleatorios llamado mt
. random_device()
es más lento que mt19937
, pero no es necesario inicializarlo porque solicita datos aleatorios de su sistema operativo (que se obtendrán de varias ubicaciones, como RdRand , por ejemplo).
Al observar esta pregunta/respuesta , parece que uniform_real_distribution
devuelve un número en el rango [a, b)
que desea [a, b]
. Para hacer eso, nuestro uniform_real_distibution
debería verse así:
std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));
Mi biblioteca 'aleatoria' proporciona un contenedor muy conveniente para las clases aleatorias de C++ 11. Puedes hacer casi todo con un simple método "obtener".
Ejemplos:
Número aleatorio en un rango
auto val = Random::get(-10, 10); // Integer auto val = Random::get(10.f, -10.f); // Float point
booleano aleatorio
auto val = Random::get<bool>( ) // 50% to generate true auto val = Random::get<bool>( 0.7 ) // 70% to generate true
Valor aleatorio de un std::initilizer_list
auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
Iterador aleatorio del rango de iteradores o de todos los contenedores
auto it = Random::get( vec.begin(), vec.end() ); // it = random iterator auto it = Random::get( vec ); // return random iterator
¡Y aún más cosas! Consulte la página de github:
https://github.com/effolkronium/random