QRandomGenerator Class
Die Klasse QRandomGenerator ermöglicht es, Zufallswerte von einem hochwertigen Zufallszahlengenerator zu erhalten. Mehr...
Kopfzeile: | #include <QRandomGenerator> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
Vererbt von: |
Hinweis: Alle Funktionen in dieser Klasse sind reentrant.
Hinweis: Diese Funktionen sind auch thread-sicher:
Öffentliche Typen
Öffentliche Funktionen
QRandomGenerator(quint32 seedValue = 1) | |
QRandomGenerator(const quint32 (&)[N] seedBuffer) | |
QRandomGenerator(std::seed_seq &sseq) | |
QRandomGenerator(const quint32 *begin, const quint32 *end) | |
QRandomGenerator(const quint32 *seedBuffer, qsizetype len) | |
QRandomGenerator(const QRandomGenerator &other) | |
double | bounded(double highest) |
int | bounded(int highest) |
qint64 | bounded(qint64 highest) |
quint32 | bounded(quint32 highest) |
quint64 | bounded(quint64 highest) |
int | bounded(int lowest, int highest) |
qint64 | bounded(int lowest, qint64 highest) |
qint64 | bounded(qint64 lowest, int highest) |
qint64 | bounded(qint64 lowest, qint64 highest) |
quint32 | bounded(quint32 lowest, quint32 highest) |
quint64 | bounded(quint64 lowest, quint64 highest) |
quint64 | bounded(quint64 lowest, unsigned int highest) |
quint64 | bounded(unsigned int lowest, quint64 highest) |
void | discard(unsigned long long z) |
void | fillRange(UInt (&)[N] buffer) |
void | fillRange(UInt *buffer, qsizetype count) |
quint64 | generate64() |
quint32 | generate() |
void | generate(ForwardIterator begin, ForwardIterator end) |
double | generateDouble() |
void | seed(quint32 seed = 1) |
void | seed(std::seed_seq &seed) |
QRandomGenerator::result_type | operator()() |
Statische öffentliche Mitglieder
QRandomGenerator * | global() |
QRandomGenerator::result_type | max() |
QRandomGenerator::result_type | min() |
QRandomGenerator | securelySeeded() |
QRandomGenerator * | system() |
Verwandte Nicht-Mitglieder
bool | operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2) |
Detaillierte Beschreibung
QRandomGenerator kann verwendet werden, um Zufallswerte von einem hochwertigen Zufallszahlengenerator zu erzeugen. Wie die C++-Zufallsgeneratoren kann QRandomGenerator über den Konstruktor mit vom Benutzer bereitgestellten Werten geimpft werden. Die von dieser Klasse erzeugte Zahlenfolge ist deterministisch, wenn sie mit Werten gefüllt ist. Das bedeutet, dass QRandomGenerator bei gleichen Seed-Daten die gleiche Zahlenfolge erzeugt. Bei unterschiedlichen Seeds sollten die Ergebnisse jedoch deutlich unterschiedlich sein.
QRandomGenerator::securelySeeded() kann verwendet werden, um einen QRandomGenerator zu erstellen, der mit QRandomGenerator::system() sicher geimpft ist, was bedeutet, dass die von ihm erzeugte Zahlenfolge nicht einfach vorhergesagt werden kann. Außerdem gibt QRandomGenerator::global() eine globale Instanz von QRandomGenerator zurück, bei der Qt sicherstellt, dass sie sicher geimpft ist. Dieses Objekt ist thread-sicher, kann für die meisten Zwecke gemeinsam genutzt werden und wird immer von QRandomGenerator::system() aus geimpft.
QRandomGenerator::system() kann verwendet werden, um auf den kryptographisch sicheren Zufallsgenerator des Systems zuzugreifen. Auf Unix-Systemen ist dies gleichbedeutend mit dem Lesen von /dev/urandom
oder den Systemaufrufen getrandom()
oder getentropy()
.
Die Klasse kann 32-Bit- oder 64-Bit-Werte generieren oder ein Array mit diesen Werten füllen. Die gebräuchlichste Art, neue Werte zu erzeugen, ist der Aufruf der Funktionen generate(), generate64() oder fillRange(). Man würde sie als verwenden:
quint32 value = QRandomGenerator::global()->generate();
Außerdem gibt es eine Fließkommafunktion generateDouble(), die eine Zahl im Bereich [0, 1] zurückgibt (d. h. einschließlich Null und ausschließlich 1). Außerdem gibt es eine Reihe von Komfortfunktionen, die es erleichtern, eine Zufallszahl in einem begrenzten, ganzzahligen Bereich zu erhalten.
Seeding und Determinismus
QRandomGenerator kann mit bestimmten Seed-Daten geimpft werden. Wenn dies geschieht, werden die vom Objekt erzeugten Zahlen immer gleich sein, wie im folgenden Beispiel:
QRandomGenerator prng1(1234), prng2(1234); Q_ASSERT(prng1.generate() == prng2.generate()); Q_ASSERT(prng1.generate64() == prng2.generate64());
Die Seed-Daten haben die Form von einem oder mehreren 32-Bit-Wörtern. Die ideale Seed-Größe entspricht ungefähr der Größe der QRandomGenerator-Klasse selbst. Aufgrund der Vermischung der Seed-Daten kann QRandomGenerator nicht garantieren, dass unterschiedliche Seeds unterschiedliche Sequenzen erzeugen.
QRandomGenerator::globalQRandomGenerator () wird, wie alle Generatoren, die von QRandomGenerator::securelySeeded() erzeugt werden, immer von QRandomGenerator::system() gesetzt, so dass es nicht möglich ist, identische Sequenzen zu erzeugen.
Massenhafte Daten
Wenn QRandomGenerator im deterministischen Modus arbeitet, kann er für die Erzeugung von Massendaten verwendet werden. Anwendungen, die keine kryptographisch sicheren oder echten Zufallsdaten benötigen, sollten einen regulären QRandomGenerator anstelle von QRandomGenerator::system() für ihre Zufallsdaten verwenden.
Zur Vereinfachung stellt QRandomGenerator ein globales Objekt zur Verfügung, das einfach verwendet werden kann, wie im folgenden Beispiel:
int x = QRandomGenerator::global()->generate(); int y = QRandomGenerator::global()->generate(); int w = QRandomGenerator::global()->bounded(16384); int h = QRandomGenerator::global()->bounded(16384);
Systemweiter Zufallszahlengenerator
QRandomGenerator::system() kann verwendet werden, um auf den systemweiten Zufallszahlengenerator zuzugreifen, der auf allen Systemen, auf denen Qt läuft, kryptographisch sicher ist. Diese Funktion nutzt die Möglichkeiten der Hardware, um Zufallszahlen zu generieren, sofern diese verfügbar sind. Auf solchen Systemen sind diese Einrichtungen echte Zufallszahlengeneratoren. Wenn es sich jedoch um echte RNGs handelt, haben diese Einrichtungen endliche Entropiequellen und können daher keine Ergebnisse liefern, wenn ihr Entropiepool erschöpft ist.
Wenn das passiert, wird zuerst das Betriebssystem und dann QRandomGenerator auf Pseudo-Zufallszahlengeneratoren abnehmender Qualität zurückgreifen (wobei der Fallback-Generator von Qt der einfachste ist). Ob diese Generatoren noch kryptografische Qualität haben, ist implementierungsabhängig. Daher sollte QRandomGenerator::system() nicht für hochfrequente Zufallszahlengenerierung verwendet werden, damit der Entropie-Pool nicht leer wird. Als Faustregel gilt, dass diese Klasse nicht mehr als ein Kilobyte pro Sekunde an Zufallsdaten erzeugen sollte (Hinweis: Dies kann von System zu System variieren).
Wenn eine Anwendung echte RNG-Daten in großen Mengen benötigt, sollte sie direkt die Einrichtungen des Betriebssystems (wie /dev/random
unter Linux) verwenden und warten, bis Entropie verfügbar wird. Wenn die Anwendung PRNG-Engines von kryptografischer Qualität, aber nicht von echter Zufälligkeit benötigt, kann QRandomGenerator::system() trotzdem verwendet werden (siehe Abschnitt unten).
Wenn weder ein echter RNG noch ein kryptographisch sicherer PRNG benötigt wird, sollten Anwendungen stattdessen PRNG-Engines wie den deterministischen Modus von QRandomGenerator und die der C++ Standard Library verwenden. QRandomGenerator::system() kann verwendet werden, um diese zu seeden.
Fallback-Qualität
QRandomGenerator::system() verwendet die Einrichtungen des Betriebssystems, um Zufallszahlen zu erhalten, die versuchen, echte Entropie aus der Umgebung zu sammeln, um echte Zufallszahlen zu erzeugen. Es ist jedoch möglich, dass der Entropie-Pool erschöpft ist. In diesem Fall greift das Betriebssystem für eine gewisse Zeit auf eine Pseudo-Zufallsmaschine zurück. Unter keinen Umständen wird QRandomGenerator::system() blockieren und darauf warten, dass mehr Entropie gesammelt wird.
Die folgenden Betriebssysteme garantieren, dass die Ergebnisse ihrer Zufallsgenerator-API von mindestens kryptografisch sicherer Qualität sind, selbst wenn der Entropie-Pool erschöpft ist: Apple-Betriebssysteme (Darwin), BSDs, Linux, Windows. Abgesehen von einem Problem bei der Systeminstallation (z. B. wenn /dev/urandom
vom aktuellen Prozess nicht gelesen werden kann), bietet QRandomGenerator::system() daher die gleichen Garantien.
Auf anderen Betriebssystemen wird QRandomGenerator auf einen PRNG mit guter numerischer Verteilung zurückgreifen, kann aber nicht in allen Fällen ein korrektes Seeding garantieren. Bitte konsultiere die Dokumentation des Betriebssystems für weitere Informationen.
Anwendungen, die erfordern, dass QRandomGenerator nicht auf nicht-kryptographische Generatoren zurückgreift, sollten die Dokumentation ihres Betriebssystems konsultieren oder ihren Einsatz auf einen der oben genannten beschränken.
Reentrancy und Thread-Safety
QRandomGenerator ist reentrant, d.h. mehrere Threads können gleichzeitig auf dieser Klasse arbeiten, solange sie auf unterschiedlichen Objekten arbeiten. Wenn sich mehrere Threads eine PRNG-Sequenz teilen müssen, ist eine externe Sperrung durch einen Mutex erforderlich.
Eine Ausnahme bilden die Objekte, die von QRandomGenerator::global() und QRandomGenerator::system() zurückgegeben werden: Diese Objekte sind thread-sicher und können von jedem Thread ohne externe Sperre verwendet werden. Beachten Sie, dass sich die Thread-Sicherheit nicht auf das Kopieren dieser Objekte erstreckt: Sie sollten immer per Referenz verwendet werden.
Kompatibilität mit der Standard-C++-Bibliothek
QRandomGenerator ist nach den Anforderungen für Zufallszahlen-Engines in der C++ Standard Library modelliert und kann in fast allen Kontexten verwendet werden, in denen die Engines der Standard Library verwendet werden können. Ausnahmen von den Anforderungen sind die folgenden:
- QRandomGenerator unterstützt kein Seeding von einer anderen Seed-Sequence-ähnlichen Klasse als std::seed_seq selbst;
- QRandomGenerator ist nicht vergleichbar (aber kopierbar) oder streambar zu
std::ostream
oder vonstd::istream
.
QRandomGenerator ist auch mit den Gleichverteilungsklassen std::uniform_int_distribution
und std:uniform_real_distribution
sowie der freien Funktion std::generate_canonical
kompatibel. Der folgende Code kann zum Beispiel verwendet werden, um eine Fließkommazahl im Bereich [1, 2.5] zu erzeugen:
std::uniform_real_distribution dist(1, 2.5); return dist(*QRandomGenerator::global());
Siehe auch QRandomGenerator64.
Dokumentation der Mitgliedstypen
QRandomGenerator::result_type
Ein Typedef für den Typ, den operator() zurückgibt. Das heißt, quint32.
Siehe auch operator().
Dokumentation der Mitgliedsfunktionen
qint64 QRandomGenerator::bounded(int lowest, qint64 highest)
qint64 QRandomGenerator::bounded(qint64 lowest, int highest)
quint64 QRandomGenerator::bounded(quint64 lowest, unsigned int highest)
quint64 QRandomGenerator::bounded(unsigned int lowest, quint64 highest)
Dies ist eine überladene Funktion.
Diese Funktion soll bei der Überladungsauflösung helfen, wenn die Typen der Parameter nicht genau übereinstimmen. Der kleinere Typ wird in den Typ des größeren überführt und die richtige Überladung aufgerufen.
QRandomGenerator::QRandomGenerator(quint32 seedValue = 1)
Initialisiert dieses QRandomGenerator-Objekt mit dem Wert seedValue als Startwert. Zwei Objekte, die mit demselben Seed-Wert erstellt oder neu gesetzt werden, erzeugen dieselbe Zahlenfolge.
Siehe auch seed() und securelySeeded().
template <qsizetype N> QRandomGenerator::QRandomGenerator(const quint32 (&)[N] seedBuffer)
Dies ist eine überladene Funktion.
Initialisiert dieses QRandomGenerator-Objekt mit den im Array seedBuffer gefundenen Werten als Seed. Zwei Objekte, die mit demselben Seed-Wert erstellt oder neu gesetzt werden, erzeugen dieselbe Zahlenfolge.
Siehe auch seed() und securelySeeded().
[noexcept]
QRandomGenerator::QRandomGenerator(std::seed_seq &sseq)
Dies ist eine überladene Funktion.
Initialisiert dieses QRandomGenerator-Objekt mit der Seed-Sequenz sseq als Seed. Zwei Objekte, die mit demselben Seed-Wert erzeugt oder neu gesetzt wurden, erzeugen dieselbe Zahlenfolge.
Siehe auch seed() und securelySeeded().
QRandomGenerator::QRandomGenerator(const quint32 *begin, const quint32 *end)
Dies ist eine überladene Funktion.
Initialisiert dieses QRandomGenerator-Objekt mit den im Bereich von begin bis end gefundenen Werten als Startwert. Zwei Objekte, die mit demselben Seed-Wert konstruiert oder neu initialisiert wurden, werden dieselbe Zahlenfolge erzeugen.
Dieser Konstruktor ist äquivalent zu:
std::seed_seq sseq(begin, end); QRandomGenerator generator(sseq);
Siehe auch seed() und securelySeeded().
QRandomGenerator::QRandomGenerator(const quint32 *seedBuffer, qsizetype len)
Dies ist eine überladene Funktion.
Initialisiert dieses QRandomGenerator-Objekt mit den im Array seedBuffer gefundenen Werten len als Seed. Zwei Objekte, die mit demselben Seed-Wert konstruiert oder neu initialisiert wurden, erzeugen dieselbe Zahlenfolge.
Dieser Konstruktor ist äquivalent zu:
std::seed_seq sseq(seedBuffer, seedBuffer + len); QRandomGenerator generator(sseq);
Siehe auch seed() und securelySeeded().
QRandomGenerator::QRandomGenerator(const QRandomGenerator &other)
Erzeugt eine Kopie des Generatorstatus im Objekt other. Wenn other QRandomGenerator::system () oder eine Kopie davon ist, liest dieses Objekt auch von den Zufallsgeneratoreinrichtungen des Betriebssystems. In diesem Fall werden die von den beiden Objekten erzeugten Sequenzen unterschiedlich sein.
In allen anderen Fällen beginnt das neue QRandomGenerator-Objekt an der gleichen Position in der deterministischen Sequenz wie das other -Objekt. Beide Objekte erzeugen von diesem Punkt an die gleiche Sequenz.
Aus diesem Grund ist es nicht ratsam, eine Kopie von QRandomGenerator::global() zu erstellen. Wenn man einen exklusiven deterministischen Generator benötigt, sollte man stattdessen securelySeeded() verwenden, um ein neues Objekt zu erhalten, das keine Beziehung zu QRandomGenerator::global() hat.
double QRandomGenerator::bounded(double highest)
Erzeugt einen zufälligen Double im Bereich zwischen 0 (einschließlich) und highest (ausschließlich). Diese Funktion ist äquivalent zu und wird implementiert als:
return generateDouble() * highest;
Wenn der Parameter highest negativ ist, ist auch das Ergebnis negativ; wenn er unendlich oder NaN ist, ist auch das Ergebnis unendlich oder NaN (d.h. nicht zufällig).
Siehe auch generateDouble() und bounded().
int QRandomGenerator::bounded(int highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 32-Bit-Menge im Bereich zwischen 0 (einschließlich) und highest (ausschließlich). highest muss positiv sein.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im gesamten 32-Bit-Bereich von int zu erhalten. Verwenden Sie stattdessen generate() und wandeln Sie in int um.
Siehe auch generate(), generate64(), und generateDouble().
qint64 QRandomGenerator::bounded(qint64 highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 64-Bit-Menge im Bereich zwischen 0 (einschließlich) und highest (ausschließlich). highest muss positiv sein.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im vollen 64-Bit-Bereich von qint64
zu erhalten. Verwenden Sie stattdessen generate64() und casten Sie nach qint64 oder verwenden Sie stattdessen die vorzeichenlose Version dieser Funktion.
Hinweis: Diese Funktion ist als Schleife implementiert, die von dem erhaltenen Zufallswert abhängt. Auf lange Sicht sollte sie im Durchschnitt knapp 2 Schleifen durchlaufen, aber wenn der Zufallsgenerator defekt ist, kann die Ausführung dieser Funktion erheblich länger dauern.
Siehe auch generate(), generate64(), und generateDouble().
quint32 QRandomGenerator::bounded(quint32 highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 32-Bit-Menge im Bereich zwischen 0 (einschließlich) und highest (ausschließlich). Das gleiche Ergebnis erhält man auch durch die Verwendung von std::uniform_int_distribution
mit den Parametern 0 und highest - 1
. Diese Klasse kann auch verwendet werden, um Mengen zu erhalten, die größer als 32 Bit sind; für 64 Bit kann auch die Überladung 64-bit bounded() verwendet werden.
Um zum Beispiel einen Wert zwischen 0 und 255 (einschließlich) zu erhalten, würde man schreiben:
quint32 v = QRandomGenerator::global()->bounded(256);
Natürlich könnte man dasselbe auch erreichen, indem man das Ergebnis von generate() nur auf die unteren 8 Bits beschränkt. Beide Lösungen sind genauso effizient.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im vollen 32-Bit-Bereich von quint32 zu erhalten. Verwenden Sie stattdessen generate().
Siehe auch generate(), generate64(), und generateDouble().
quint64 QRandomGenerator::bounded(quint64 highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 64-Bit-Menge im Bereich zwischen 0 (einschließlich) und highest (ausschließlich). Das gleiche Ergebnis erhält man auch durch die Verwendung von std::uniform_int_distribution<quint64>
mit den Parametern 0 und highest - 1
.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im gesamten 64-Bit-Bereich von quint64
zu erhalten. Verwenden Sie stattdessen generate64().
Hinweis: Diese Funktion ist als Schleife implementiert, die von dem erhaltenen Zufallswert abhängt. Auf lange Sicht sollte die Schleife im Durchschnitt nur knapp 2 Mal durchlaufen werden, aber wenn der Zufallsgenerator defekt ist, kann die Ausführung dieser Funktion erheblich länger dauern.
Siehe auch generate(), generate64(), und generateDouble().
int QRandomGenerator::bounded(int lowest, int highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 32-Bit-Menge im Bereich zwischen lowest (einschließlich) und highest (ausschließlich), die beide negativ sein können, aber highest muss größer als lowest sein.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im gesamten 32-Bit-Bereich von int zu erhalten. Verwenden Sie stattdessen generate() und wandeln Sie in int um.
Siehe auch generate(), generate64(), und generateDouble().
qint64 QRandomGenerator::bounded(qint64 lowest, qint64 highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 64-Bit-Menge im Bereich zwischen lowest (einschließlich) und highest (ausschließlich), die beide negativ sein können, aber highest muss größer als lowest sein.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im gesamten 64-Bit-Bereich von qint64
zu erhalten. Verwenden Sie stattdessen generate64() und wandeln Sie es in qint64 um.
Hinweis: Diese Funktion ist als Schleife implementiert, die von dem erhaltenen Zufallswert abhängt. Auf lange Sicht sollte die Schleife im Durchschnitt nur knapp 2 Mal durchlaufen werden, aber wenn der Zufallsgenerator defekt ist, kann die Ausführung dieser Funktion erheblich länger dauern.
Siehe auch generate(), generate64(), und generateDouble().
quint32 QRandomGenerator::bounded(quint32 lowest, quint32 highest)
Dies ist eine überladene Funktion.
Erzeugt eine zufällige 32-Bit-Menge im Bereich zwischen lowest (einschließlich) und highest (ausschließlich). Der Parameter highest muss größer als lowest sein.
Das gleiche Ergebnis erhält man auch durch die Verwendung von std::uniform_int_distribution
mit den Parametern lowest und \a highest - 1
. Diese Klasse kann auch verwendet werden, um Größen zu erhalten, die größer als 32 Bit sind.
Um zum Beispiel einen Wert zwischen 1000 (einschl.) und 2000 (ausschl.) zu erhalten, würde man schreiben:
quint32 v = QRandomGenerator::global()->bounded(1000, 2000);
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im vollen 32-Bit-Bereich von quint32 zu erhalten. Verwenden Sie stattdessen generate().
Siehe auch generate(), generate64(), und generateDouble().
quint64 QRandomGenerator::bounded(quint64 lowest, quint64 highest)
Dies ist eine überladene Funktion.
Erzeugt eine 64-Bit-Zufallsmenge im Bereich zwischen lowest (einschließlich) und highest (ausschließlich). Der Parameter highest muss größer als lowest sein.
Das gleiche Ergebnis erhält man auch durch die Verwendung von std::uniform_int_distribution<quint64>
mit den Parametern lowest und \a highest - 1
.
Beachten Sie, dass diese Funktion nicht verwendet werden kann, um Werte im vollen 64-Bit-Bereich von quint64
zu erhalten. Verwenden Sie stattdessen generate64().
Hinweis: Diese Funktion ist als Schleife implementiert, die von dem erhaltenen Zufallswert abhängt. Auf lange Sicht sollte die Schleife im Durchschnitt nur knapp 2 Mal durchlaufen werden, aber wenn der Zufallsgenerator defekt ist, kann die Ausführung dieser Funktion erheblich länger dauern.
Siehe auch generate(), generate64(), und generateDouble().
void QRandomGenerator::discard(unsigned long long z)
Verwirft die nächsten z Einträge aus der Sequenz. Diese Methode ist gleichbedeutend mit dem Aufruf von generate() z und dem Verwerfen des Ergebnisses, wie in:
while (z--) generator.generate();
template <typename UInt, size_t N, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt (&)[N] buffer)
Erzeugt N
32- oder 64-Bit-Mengen (je nach Typ UInt
) und speichert sie im Array buffer. Dies ist der effizienteste Weg, um mehr als eine Menge auf einmal zu erhalten, da es die Anzahl der Aufrufe in der Zufallszahlengeneratorquelle reduziert.
Um zum Beispiel zwei 32-Bit-Mengen zu erzeugen, kann man schreiben:
quint32 array[2]; QRandomGenerator::global()->fillRange(array);
Es wäre auch möglich gewesen, einen Aufruf an generate64() zu machen und dann die beiden Hälften des 64-Bit-Wertes aufzuteilen.
Siehe auch generate().
template <typename UInt, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt *buffer, qsizetype count)
Erzeugt count 32- oder 64-Bit-Mengen (je nach Typ UInt
) und speichert sie in dem Puffer, auf den buffer zeigt. Dies ist der effizienteste Weg, um mehr als eine Menge auf einmal zu erhalten, da es die Anzahl der Aufrufe der Zufallszahlengeneratorquelle reduziert.
Um zum Beispiel eine Liste mit 16 Einträgen mit Zufallswerten zu füllen, kann man schreiben:
QList<quint32> list; list.resize(16); QRandomGenerator::global()->fillRange(list.data(), list.size());
Siehe auch generate().
quint64 QRandomGenerator::generate64()
Erzeugt eine 64-Bit-Zufallsmenge und gibt sie zurück.
Siehe auch operator()() und generate().
quint32 QRandomGenerator::generate()
Erzeugt eine 32-Bit-Zufallsmenge und gibt sie zurück.
Siehe auch operator()() und generate64().
template <typename ForwardIterator> void QRandomGenerator::generate(ForwardIterator begin, ForwardIterator end)
Erzeugt 32-Bit-Mengen und speichert sie im Bereich zwischen begin und end. Diese Funktion ist äquivalent zu (und wird implementiert als):
std::generate(begin, end, [this]() { return generate(); });
Diese Funktion erfüllt die Anforderungen für die Funktion std::seed_seq::generate
die vorzeichenlose 32-Bit-Ganzzahlwerte benötigt.
Beachten Sie, dass, wenn der Bereich [Anfang, Ende] sich auf einen Bereich bezieht, der mehr als 32 Bits pro Element speichern kann, die Elemente trotzdem nur mit 32 Bits an Daten initialisiert werden. Alle anderen Bits sind dann Null. Um den Bereich mit 64-Bit-Mengen zu füllen, kann man schreiben:
std::generate(begin, end, []() { return QRandomGenerator::global()->generate64(); });
Bezieht sich der Bereich auf einen zusammenhängenden Speicher (z. B. ein Array oder die Daten einer QList), kann auch die Funktion fillRange() verwendet werden.
Siehe auch fillRange().
double QRandomGenerator::generateDouble()
Erzeugt einen zufälligen qreal im kanonischen Bereich [0, 1) (d.h. einschließlich Null und ausschließlich 1).
Diese Funktion ist äquivalent zu:
QRandomGenerator64 rd; return std::generate_canonical<qreal, std::numeric_limits<qreal>::digits>(rd);
Dasselbe erhält man auch durch Verwendung von std::uniform_real_distribution
mit den Parametern 0 und 1.
Siehe auch generate(), generate64(), und bounded().
[static]
QRandomGenerator *QRandomGenerator::global()
Gibt einen Zeiger auf ein gemeinsam genutztes QRandomGenerator zurück, das mit securelySeeded() geimpft wurde. Diese Funktion sollte verwendet werden, um Zufallsdaten zu erzeugen, ohne die teure Erstellung eines sicher geseedeten QRandomGenerator für eine bestimmte Verwendung oder die Speicherung des recht großen QRandomGenerator Objekts.
Im Folgenden wird zum Beispiel eine zufällige RGB-Farbe erzeugt:
return QColor::fromRgb(QRandomGenerator::global()->generate());
Die Zugriffe auf dieses Objekt sind thread-sicher und es kann daher in jedem Thread ohne Sperren verwendet werden. Das Objekt kann auch kopiert werden, und die von der Kopie erzeugte Sequenz ist die gleiche wie die, die das gemeinsam genutzte Objekt erzeugt. Beachten Sie jedoch, dass, wenn andere Threads auf das globale Objekt zugreifen, diese Threads in unvorhersehbaren Abständen Stichproben erhalten können.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch securelySeeded() und system().
[static constexpr]
QRandomGenerator::result_type QRandomGenerator::max()
Gibt den maximalen Wert zurück, den QRandomGenerator jemals erzeugen kann. Das heißt, std::numeric_limits<result_type>::max()
.
Siehe auch min() und QRandomGenerator64::max().
[static constexpr]
QRandomGenerator::result_type QRandomGenerator::min()
Gibt den Mindestwert zurück, den QRandomGenerator jemals erzeugen kann. Das heißt, 0.
Siehe auch max() und QRandomGenerator64::min().
[static]
QRandomGenerator QRandomGenerator::securelySeeded()
Gibt ein neues QRandomGenerator Objekt zurück, das mit QRandomGenerator::system() sicher geimpft wurde. Diese Funktion ermittelt die ideale Seed-Größe für den Algorithmus, den QRandomGenerator verwendet, und ist daher der empfohlene Weg, um ein neues QRandomGenerator -Objekt zu erstellen, das für einige Zeit aufbewahrt wird.
In Anbetracht der Datenmenge, die benötigt wird, um die deterministische Engine sicher zu seeden, ist diese Funktion etwas teuer und sollte nicht für kurzfristige Verwendungen von QRandomGenerator verwendet werden (die Verwendung dieser Funktion, um weniger als 2600 Bytes Zufallsdaten zu erzeugen, ist effektiv eine Verschwendung von Ressourcen). Wenn die Verwendung nicht so viele Daten erfordert, sollten Sie QRandomGenerator::global() verwenden und nicht stattdessen ein QRandomGenerator Objekt speichern.
Siehe auch global() und system().
void QRandomGenerator::seed(quint32 seed = 1)
Setzt dieses Objekt mit dem Wert seed als Seed neu.
[noexcept]
void QRandomGenerator::seed(std::seed_seq &seed)
Dies ist eine überladene Funktion.
Setzt dieses Objekt unter Verwendung der Seed-Sequenz seed als Seed neu.
[static]
QRandomGenerator *QRandomGenerator::system()
Gibt einen Zeiger auf eine gemeinsam genutzte QRandomGenerator zurück, die immer die vom Betriebssystem bereitgestellten Möglichkeiten zur Erzeugung von Zufallszahlen verwendet. Die Systemfunktionen gelten zumindest auf den folgenden Betriebssystemen als kryptografisch sicher: Apple OS (Darwin), BSDs, Linux, Windows. Dies kann auch auf anderen Betriebssystemen der Fall sein.
Möglicherweise werden sie auch durch einen echten Hardware-Zufallszahlengenerator unterstützt. Aus diesem Grund sollte die von dieser Funktion zurückgegebene QRandomGenerator nicht für die Erzeugung von Massendaten verwendet werden. Verwenden Sie es stattdessen, um QRandomGenerator oder eine Zufallsmaschine aus dem <random>-Header zu seeden.
Das von dieser Funktion zurückgegebene Objekt ist thread-sicher und kann in jedem Thread ohne Sperren verwendet werden. Es kann auch kopiert werden, und die resultierende QRandomGenerator wird ebenfalls auf die Einrichtungen des Betriebssystems zugreifen, aber sie werden nicht die gleiche Sequenz erzeugen.
Hinweis: Diese Funktion ist thread-sicher.
Siehe auch securelySeeded() und global().
QRandomGenerator::result_type QRandomGenerator::operator()()
Erzeugt eine 32-Bit-Zufallsmenge und gibt sie zurück.
Siehe auch generate() und generate64().
Verwandte Nicht-Mitglieder
bool operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)
Gibt true
zurück, wenn sich die beiden Engines rng1 und rng2 in unterschiedlichen Zuständen befinden oder wenn eine von ihnen aus den Betriebssystemeinrichtungen liest und die andere nicht, ansonsten false
.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.