¿Existe una función para obtener uniformemente enteros pseudoaleatorios distribuidos en algún rango especificado? Podría escribir mi propia función usando rand
, pero esto parece una situación bastante común que probablemente hay algo en el STL para eso.¿Cuál es la forma estándar de obtener enteros aleatorios distribuidos uniformemente en C++?
Respuesta
Boost proporciona muchas herramientas para la generación de números aleatorios. Para distribuciones uniformes que tienen éste:
http://www.boost.org/doc/libs/1_49_0/doc/html/boost/random/uniform_real_distribution.html
EDIT: actualizado para incluir la nueva aplicación de C++ 11. Para el caso de los números enteros, aquí se tiene la referencia:
http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
Un ejemplo sencillo sería:
#include <random>
#include <iostream>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 6);
for(int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
}
para generar números pseudo-aleatorios en C++, una muy buena opción es el uso de la Mersenne twister generador de números pseudoaleatorios motor: std::mt19937
del <random>
encabezado.
Podemos pensar en este motor como recuadro negro que escupe de alta calidad bits aleatorios.
Luego, estos bits aleatorios pueden ser conformado de alguna salida enteros utilizando una distribución ; en particular, para obtener distribuidos uniformemente números pseudoaleatorios, se puede usar std::uniform_int_distribution
.
Tenga en cuenta que el objeto del motor se debe inicializar con una semilla .
std::random_device
se puede utilizar para ese fin.
Por lo tanto, este proceso se puede resumir en tres pasos lógicos:
- crear una instancia de
std::random_device
, para obtener una semilla no determinista para el motor de Mersenne Twister. - Crea una instancia de
std::mt19937
motor, para obtener bits pseudoaleatorios de alta calidad. - Utilice
std::uniform_int_distribution
a forma estos bits aleatorios en enteros uniformemente distribuidos. código
compilable C++ sigue:
#include <iostream> // for console output
#include <random> // for pseudo-random number generators and distributions
int main()
{
// Use random_device to generate a seed for Mersenne twister engine.
std::random_device rd;
// Use Mersenne twister engine to generate pseudo-random numbers.
std::mt19937 engine(rd());
// "Filter" MT engine's output to generate pseudo-random integer values,
// **uniformly distributed** on the closed interval [0, 99].
// (Note that the range is [inclusive, inclusive].)
std::uniform_int_distribution<int> dist(0, 99);
// Generate and print 10 pseudo-random integers
for (int i = 0; i < 10; ++i)
{
std::cout << dist(engine) << ' ';
}
std::cout << std::endl;
}
Para más detalles sobre la generación de números pseudo-aleatorios en C++ (incluyendo razones por rand()
es no bueno), consulte este vídeo de Stephan T. Lavavej (de Going Native 2013):
+1 Seguro que demoró un poco, pero finalmente se fusionó. Es posible que desee editar su pregunta para indicar que también formó parte de una combinación y un comentario al OP para que comprendan por qué esta nueva respuesta apareció con una fecha anterior. –
No sé por qué todos dicen que Mersenne Twister es tan genial y de "alta calidad". No es. Es complicado, tiene una enorme huella de memoria y aún falla en múltiples pruebas del conjunto de pruebas TestU01 BigCrush. Actualmente hay varios PRNG más simples, más rápidos y de mayor calidad con periodos adecuados. – plasmacel
@plasmacel: Le pregunté a Stephan T. Lavavej (mantenedor de VC STL) y me confirmó que es el mejor PRNG estándar. ¿Qué propones como mejores alternativas? –
para generar una o número especificado de variables aleatorias con distribución uniforme en el dominio entero usando std::generate_n
y boost
:
#include <iostream>
#include <algorithm>
#include <boost/random.hpp>
/*
*
*/
int main(int argc, char** argv) {
boost::mt19937 rand_generator(std::time(NULL));
boost::random::uniform_int_distribution<> int_distribution(0, 100);
//Need to pass generator
std::cout << int_distribution(rand_generator) << std::endl;
//Associate generator with distribution
boost::random::variate_generator<boost::mt19937&,
boost::random::uniform_int_distribution<>
> int_variate_generator(rand_generator, int_distribution);
//No longer need to pass generator
std::cout << int_variate_generator() << std::endl;
std::generate_n(std::ostream_iterator<int>(std::cout, ","), 3, int_variate_generator);
return 0;
}
- 1. ¿Cuál es la forma estándar de obtener el estado de un generador de números aleatorios C++ 0x?
- 2. Generación de números aleatorios distribuidos
- 3. ¿Generar puntos aleatorios distribuidos como ciudades?
- 4. números aleatorios distribuidos de manera uniforme
- 5. Generar números aleatorios distribuidos por Zipf
- 6. Generación de números aleatorios secuenciales distribuidos en Ruby 1.9.2
- 7. Código para generar números aleatorios gaussianos (normalmente distribuidos) en Ruby
- 8. generar enteros aleatorios con probabilidades
- 9. Entonces, ¿cuál es la diferencia entre distribuidos y agrupados?
- 10. ¿Cuál es la forma recomendada de obtener winhttp.h?
- 11. ¿Cuál es la mejor forma de diseñar una clase C#?
- 12. ¿Cuál es la forma correcta de usar bitfields en C?
- 13. ¿Cuál es una buena forma de generar clústeres y rutas aleatorios?
- 14. ¿Cuál es la mejor manera de obtener números aleatorios en NumPy?
- 15. ¿Cuál es la forma más eficiente de almacenar una matriz de enteros en una columna MySQL?
- 16. ¿Cuál es la forma correcta de liberar memoria en C#
- 17. ¿Cuál es la forma correcta de manejar eventos en C++?
- 18. ¿Cuál es la forma habitual de afirmación en C?
- 19. ¿Cuál es la mejor forma de formatear C# en WordPress?
- 20. ¿Cuál es la mejor forma de obtener Contexto?
- 21. ¿Cuál es la forma estándar de optimizar la recursión mutua en F #/Scala?
- 22. Números aleatorios en la API POSIX C
- 23. Generando enteros aleatorios con probabilidades dadas
- 24. ¿Cuál es una forma correcta y buena de implementar __hash __()?
- 25. javascript 5 enteros aleatorios que no duplican 0 - 20
- 26. ¿Cuál es la forma más fácil de obtener una OutOfMemoryException en C#?
- 27. Modificar el rango de un generador de números aleatorios uniforme
- 28. Generar números aleatorios de forma segura en Objective-C
- 29. ¿Cuál es la forma más rápida de ordenar una matriz de 7 enteros?
- 30. ¿Cuál es la forma estándar de eliminar elementos de una lista en OCaml?
y ahora son parte de ** C++ 11 ** por lo que son estándar. –
@ K-ballo eso es genial! C++ 11 está haciendo C++ mucho más fácil :) – betabandido
Tal vez un pequeño ejemplo de código podría ser útil. – authchir