Genere números aleatorios usando la biblioteca aleatoria C ++ 11

Resuelto smac89 asked hace 11 años • 6 respuestas

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]

smac89 avatar Oct 30 '13 01:10 smac89
Aceptado

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_deviceonce 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_distributiondevuelve un número en el rango [a, b)que desea [a, b]. Para hacer eso, nuestro uniform_real_distibutiondebería verse así:

std::uniform_real_distribution<double> dist(1, std::nextafter(10, DBL_MAX));
Bill Lynch avatar Oct 29 '2013 18:10 Bill Lynch

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:

  1. Número aleatorio en un rango

    auto val = Random::get(-10, 10); // Integer
    auto val = Random::get(10.f, -10.f); // Float point
    
  2. booleano aleatorio

    auto val = Random::get<bool>( ) // 50% to generate true
    auto val = Random::get<bool>( 0.7 ) // 70% to generate true
    
  3. Valor aleatorio de un std::initilizer_list

    auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...
    
  4. 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

effolkronium avatar Aug 05 '2017 18:08 effolkronium