Namespaces
Variants

std::random_device:: random_device

From cppreference.net
random_device ( ) : random_device ( /*implementation-defined*/ ) { }
(1) (desde C++11)
explicit random_device ( const std:: string & token ) ;
(2) (desde C++11)
random_device ( const random_device & ) = delete ;
(3) (desde C++11)
1) Construye por defecto un nuevo objeto std::random_device con un token definido por la implementación.
2) Construye un nuevo objeto std::random_device , utilizando el argumento token de una manera definida por la implementación.
3) El constructor de copia está eliminado: std::random_device no es copiable ni movible.

Contenidos

Excepciones

Lanza una excepción definida por la implementación derivada de std::exception en caso de fallo.

Notas

La implementación en libstdc++ espera que token nombre la fuente de bytes aleatorios. Los valores posibles de token incluyen "default" , "hw" , "rand_s" , "rdseed" , "rdrand" , "rdrnd" , "/dev/urandom" , "/dev/random" , "mt19937" , y cadenas enteras que especifican la semilla del motor mt19937. (Los valores de token distintos de "default" solo son válidos para ciertos objetivos.)

La implementación en libc++ , cuando está configurada para usar un dispositivo de caracteres como fuente, espera que token sea el nombre de un dispositivo de caracteres que produzca números aleatorios cuando se lea de él; de lo contrario, espera que token sea "/dev/urandom" .

Tanto libstdc++ como libc++ lanzan una excepción si se proporciona un token no compatible. La stdlib de Microsoft ignora el token completamente.

Ejemplo

Demuestra los tipos comúnmente disponibles de std::random_device en Linux.

#include <iostream>
#include <random>
void demo(std::random_device&& rd)
{
    static std::uniform_int_distribution<int> d(0, 9);
    for (int n = 0; n != 10; ++n)
        std::cout << d(rd) << ' ';
    std::cout << '\n';
}
int main()
{
    // Nota: ¡Cómo se maneja el token proporcionado está definido por la implementación!
    // El token por defecto para random_device es usualmente /dev/urandom en Linux
    demo(std::random_device {});
    // Solicita /dev/random, se bloquea cuando la entropía está vacía
    // Funciona en libstdc++, ignorado en msvc++, podría lanzar excepción en libc++ (a partir de Nov 2022)
    demo(std::random_device {"/dev/random"});
    // Solicita /dev/urandom no bloqueante, asegura que RDRAND no sea utilizado
    // Funciona en libstdc++ y libc++, ignorado en msvc++ (a partir de Nov 2022)
    demo(std::random_device {"/dev/urandom"});
    // Solicita "hw", utilizará generación aleatoria basada en hardware como rdrand
    // Funciona en libstdc++, ignorado en msvc++, lanza excepción en libc++ (a partir de Nov 2022)
    demo(std::random_device {"hw"});
}

Salida posible:

9 5 2 7 5 9 4 1 0 7 
4 7 6 5 1 5 5 1 8 6 
3 3 6 1 4 1 4 1 0 2 
4 6 3 9 1 9 4 0 9 3

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
P0935R0 C++11 el constructor por defecto era explícito hecho implícito