std:: random_device
|
Definido en el encabezado
<random>
|
||
|
class
random_device
;
|
(desde C++11) | |
std::random_device
es un generador de números aleatorios enteros distribuidos uniformemente que produce números aleatorios no deterministas.
std::random_device
puede implementarse en términos de un motor de números pseudoaleatorios definido por la implementación si no hay disponible una fuente no determinista (por ejemplo, un dispositivo de hardware) para la implementación. En este caso, cada objeto
std::random_device
puede generar la misma secuencia de números.
Contenidos |
Tipos de miembros
| Tipo de miembro | Definición |
result_type
(C++11)
|
unsigned int |
Funciones miembro
Construcción |
|
|
construye el motor
(función miembro pública) |
|
|
operator=
(deleted)
(C++11)
|
el operador de asignación está eliminado
(función miembro pública) |
Generación |
|
|
avanza el estado del motor y devuelve el valor generado
(función miembro pública) |
|
Características |
|
|
(C++11)
|
obtiene la estimación de entropía para el generador de números aleatorios no determinista
(función miembro pública) |
|
[static]
|
obtiene el valor más pequeño posible en el rango de salida
(función miembro estática pública) |
|
[static]
|
obtiene el valor más grande posible en el rango de salida
(función miembro estática pública) |
Notas
Una implementación notable donde
std::random_device
es determinista en versiones antiguas de MinGW-w64 (
bug 338
, corregido desde GCC 9.2). Las últimas versiones de MinGW-w64 pueden descargarse desde
GCC con el modelo de hilos MCF
.
Ejemplo
#include <iostream> #include <map> #include <random> #include <string> int main() { std::random_device rd; std::map<int, int> hist; std::uniform_int_distribution<int> dist(0, 9); for (int n = 0; n != 20000; ++n) ++hist[dist(rd)]; // nota: solo para demostración: el rendimiento de muchas // implementaciones de random_device se degrada rápidamente // una vez que se agota el pool de entropía. Para uso práctico // random_device generalmente solo se usa para inicializar // un PRNG como mt19937 for (auto [x, y] : hist) std::cout << x << " : " << std::string(y / 100, '*') << '\n'; }
Salida posible:
0 : ******************** 1 : ******************* 2 : ******************** 3 : ******************** 4 : ******************** 5 : ******************* 6 : ******************** 7 : ******************** 8 : ******************* 9 : ********************