[c++] Generar números aleatorios utilizando la biblioteca aleatoria C ++ 11



Answers

Mi biblioteca 'aleatoria' proporciona un envoltorio muy conveniente para las clases aleatorias de C ++ 11. Puedes hacer casi todas las cosas con un simple método 'get'.

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. Random booleano

    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 del iterador 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! Mira la página de github:

https://github.com/effolkronium/random

Question

Como sugiere el título, estoy tratando de encontrar una forma de generar números aleatorios usando la nueva biblioteca c ++ 11 <random> . Lo he intentado 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 lo ejecuto, siempre genera los mismos números. Entonces mi pregunta es ¿qué otras funciones en la biblioteca al azar pueden lograr esto siendo verdaderamente al azar?

Para mi caso de uso particular, estaba tratando de obtener un rango dentro de [1, 10]




Tienes dos situaciones comunes. La primera es que quiere números aleatorios y no se preocupa demasiado por la calidad o la velocidad de ejecución. En ese caso, use la siguiente macro

#define uniform() (rand()/(RAND_MAX + 1.0))

eso le da p en el rango de 0 a 1 - epsilon (a menos que RAND_MAX sea mayor que la precisión de un doble, pero preocúpese por eso cuando llegue).

int x = (int) (uniform () * N);

Ahora da un entero aleatorio de 0 a N -1.

Si necesita otras distribuciones, debe transformar p. O a veces es más fácil llamar al uniforme () varias veces.

Si desea un comportamiento repetible, siembre con una constante, de lo contrario siembre con una llamada a la hora ().

Ahora, si le molesta la calidad o el rendimiento del tiempo de ejecución, vuelva a escribir el uniforme (). Pero de lo contrario, no toques el código. Mantenga siempre uniforme () en 0 a 1 menos épsilon. Ahora puede envolver la biblioteca de números aleatorios de C ++ para crear un uniforme mejor (), pero esa es una especie de opción de nivel medio. Si le molestan las características del RNG, también vale la pena invertir un poco de tiempo para comprender cómo funcionan los métodos subyacentes, y luego proporcionar uno. Así que tienes el control completo del código, y puedes garantizar que con la misma similitud, la secuencia siempre será exactamente la misma, independientemente de la plataforma o de la versión de C ++ a la que estés enlazando.




Links