Zitieren von cppreference :
std :: random_device ist eine nicht-deterministische Zufallszahlen-Engine, obwohl Implementierungen std :: random_device unter Verwendung einer Pseudozufallszahlen-Engine implementieren dürfen, wenn keine Unterstützung für die nicht-deterministische Zufallszahlengenerierung besteht.
Gibt es eine Möglichkeit zu überprüfen, ob die aktuelle Implementierung PRNG anstelle von RNG verwendet (und dann sagen, Beenden mit einem Fehler) und wenn nicht, warum nicht?
Beachten Sie, dass ein wenig Googling zeigt, dass mindestens MinGW std::random_device
auf diese Weise implementiert, und das ist daher eine echte Gefahr, wenn std::random_device
verwendet werden soll.
--- bearbeiten ---
Auch wenn die Antwort nein ist und jemand einen Einblick geben könnte, warum es keine solche Funktion / Eigenschaft / etwas gibt, wäre ich ziemlich interessiert.
Gibt es eine Möglichkeit zu überprüfen, ob die aktuelle Implementierung PRNG anstelle von RNG verwendet (und dann sagen, Beenden mit einem Fehler) und wenn nicht, warum nicht?
Es gibt einen Weg: std::random_device::entropy
gibt 0.0
zurück, wenn dies der Fall ist ist in Form einer Zufallszahlen-Engine implementiert (das heißt, es ist deterministisch).
Vom Standard:
%Vor%Rückgabe: Wenn die Implementierung eine Zufallszahlen-Engine verwendet, wird
0.0
zurückgegeben. Andernfalls wird eine Entropieschätzung für die vonoperator()
zurückgegebenen Zufallszahlen im Bereichmin()
bislog_2(max() + 1)
zurückgegeben.
Es gibt keine 100% sichere Methode, um echte Zufälligkeit sicher zu bestimmen. Mit einem Black-Box-Ansatz ist das Beste, was Sie tun können, Beweise zu zeigen, wenn es nicht völlig zufällig ist:
Zuerst können Sie überprüfen, ob die Verteilung zufällig ist, indem Sie viele Zufallsmembers generieren und Statistiken über ihre Verteilung erstellen (z. B. 1 Millionen Zufallszahlen zwischen 0 und 1000 generieren). Wenn es scheint, dass einige Zahlen deutlich häufiger herauskommen als andere, dann ist es offensichtlich nicht wirklich zufällig.
Als nächstes können Sie ein Programm ausführen, das nach dem gleichen Startwert Zufallszahlen erzeugt. Wenn Sie die gleiche Sequenz von Zufallszahlen erhalten, dann ist es definitiv PRNG und keine echte Randomness. Wenn Sie jedoch nicht die selbe Sequenz erhalten, wird nichts festgestellt: Die Bibliothek könnte eine Art Auto-Seed verwenden (mit Clock-Ticks oder etwas anderem), um die Pseudo-Randomität zu verbergen / zu verbessern.
Wenn Ihre Anwendung stark von der Zufälligkeitsqualität abhängt (z. B. kryptografische Qualität), sollten Sie einige weitere Tests in Betracht ziehen, z. B. die von NIST SP 800-22