Namespaces
Variants

std::random_device:: random_device

From cppreference.net
random_device ( ) : random_device ( /*implementierungsdefiniert*/ ) { }
(1) (seit C++11)
explicit random_device ( const std:: string & token ) ;
(2) (seit C++11)
random_device ( const random_device & ) = delete ;
(3) (seit C++11)
1) Konstruiert ein neues std::random_device Objekt standardmäßig mit einem implementierungsdefinierten token .
2) Konstruiert ein neues std::random_device Objekt und verwendet dabei das Argument token auf implementierungsdefinierte Weise.
3) Der Kopierkonstruktor ist gelöscht: std::random_device ist nicht kopierbar oder verschiebbar.

Inhaltsverzeichnis

Exceptions

Wirft bei Fehler eine implementierungsdefinierte Ausnahme, die von std::exception abgeleitet ist.

Hinweise

Die Implementierung in libstdc++ erwartet, dass token die Quelle der Zufallsbytes benennt. Mögliche Token-Werte umfassen "default" , "hw" , "rand_s" , "rdseed" , "rdrand" , "rdrnd" , "/dev/urandom" , "/dev/random" , "mt19937" , und einen ganzzahligen String, der den Seed der mt19937-Engine spezifiziert. (Token-Werte außer "default" sind nur für bestimmte Targets gültig.)

Die Implementierung in libc++ erwartet, wenn sie für die Verwendung eines Character Devices als Quelle konfiguriert ist, dass token der Name eines Character Devices ist, das bei Lesevorgängen Zufallszahlen liefert; andernfalls erwartet sie, dass token "/dev/urandom" ist.

Sowohl libstdc++ als auch libc++ werfen eine Ausnahme, wenn ein nicht unterstütztes Token bereitgestellt wird. Microsofts stdlib ignoriert das Token vollständig.

Beispiel

Demonstriert häufig verfügbare Typen von std::random_device unter 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()
{
    // Hinweis: Die Verarbeitung des angegebenen Tokens ist implementierungsabhängig!
    // Standard-Token für random_device ist normalerweise /dev/urandom unter Linux
    demo(std::random_device {});
    // Fordert /dev/random an, blockiert wenn Entropie leer ist
    // Funktioniert mit libstdc++, wird in msvc++ ignoriert, könnte in libc++ werfen (Stand Nov 2022)
    demo(std::random_device {"/dev/random"});
    // Fordert nicht-blockierendes /dev/urandom an, stellt sicher dass RDRAND nicht verwendet wird
    // Funktioniert mit libstdc++ und libc++, wird in msvc++ ignoriert (Stand Nov 2022)
    demo(std::random_device {"/dev/urandom"});
    // Fordert "hw" an, verwendet hardwarebasierte Zufallsgenerierung wie rdrand
    // Funktioniert mit libstdc++, wird in msvc++ ignoriert, wirft in libc++ (Stand Nov 2022)
    demo(std::random_device {"hw"});
}

Mögliche Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
P0935R0 C++11 Standardkonstruktor war explicit implizit gemacht