<random>
Definiert Funktionen zum Generieren von Zufallszahlen und erlaubt die Erstellung gleichförmiger verteilter Zufallszahlen.
Anforderungen
Header: <random>
Namespace: std
Hinweis
Die <random>
Bibliothek verwendet die Anweisung "#include <initializer_list>".
Zusammenfassung
Ein Zufallszahlengenerator ist ein Objekt, bei dem eine Sequenz von Pseudo-Zufallswerten erzeugt wird. Ein Generator, der Werte produziert, die in einem bestimmten Bereich gleichförmig verteilt sind, ist ein Uniform Random Number Generator (URNG, einheitlicher Zufallszahlengenerator). Eine Klassenvorlage, die als URNG fungieren soll, wird als Modul bezeichnet, wenn diese Klasse bestimmte allgemeine Merkmale aufweist, die weiter unten in diesem Artikel erläutert werden. Ein URNG kann mit einer Verteilung kombiniert werden – was im Normalfall auch geschieht –, indem der URNG als Argument an den operator()
des Verteilers übergeben wird, um Werte zu produzieren, die in einer von der Verteilung definierten Art und Weise verteilt werden.
Diese Links führen zu den Hauptabschnitten dieses Artikels:
Einfache Tipps
Hier erhalten Sie einige Tipps, die Sie beachten sollten, wenn Sie <random>
verwenden:
Für die meisten Zwecke produzieren URNGs Rohbits, die durch Verteilungen geformt werden müssen. (Eine wichtige Ausnahme hierfür besteht
std::shuffle()
darin, dass eine URNG direkt verwendet wird.)Eine einzelne Instanziierung eines URNG oder einer Verteilung kann nicht gleichzeitig sicher aufgerufen werden, da die Ausführung eines URNG oder einer Verteilung ein Änderungsvorgang ist. Weitere Informationen finden Sie unter Threadsicherheit in der C++-Standardbibliothek.
Voreingestellte Typdefinitionen einiger Engines sind verfügbar. Dies ist der bevorzugte Weg zur Erstellung eines URNG, wenn eine Engine verwendet wird.
Die hilfreichste Paarung für die meisten Anwendungen ist die
mt19937
-Engine mituniform_int_distribution
, wie später in diesem Artikel im Codebeispiel gezeigt.
Der <random>
-Header enthält mehrere Optionen zur Auswahl, von denen jede der veralteten C-Laufzeitfunktion rand()
vorzuziehen ist. Informationen über die Nachteile von rand()
und die Behebung dieser Schwachpunkte durch <random>
erhalten Sie in diesem Video.
Beispiele
Im folgenden Codebeispiel wird veranschaulicht, wie einige Zufallszahlen (in diesem Fall fünf) mit einem Generator erstellt werden, der mit einem nicht-deterministischen Startwert generiert wurde.
#include <random>
#include <iostream>
using namespace std;
int main()
{
random_device rd; // non-deterministic generator
mt19937 gen(rd()); // to seed mersenne twister.
// replace the call to rd() with a
// constant value to get repeatable
// results.
for (int i = 0; i < 5; ++i) {
cout << gen() << " "; // print the raw output of the generator.
}
cout << endl;
}
2430338871 3531691818 2723770500 3252414483 3632920437
Obwohl es sich dabei um hochwertige Zufallszahlen handelt und diese bei jeder einzelnen Ausführung dieses Programms unterschiedlich sind, liegen sie nicht unbedingt in einem nützlichen Bereich. Verwenden Sie zum Steuern des Bereichs eine gleichmäßige Verteilung, wie im folgenden Code dargestellt:
#include <random>
#include <iostream>
using namespace std;
int main()
{
random_device rd; // non-deterministic generator
mt19937 gen(rd()); // to seed mersenne twister.
uniform_int_distribution<> dist(1,6); // distribute results between 1 and 6 inclusive.
for (int i = 0; i < 5; ++i) {
cout << dist(gen) << " "; // pass the generator to the distribution.
}
cout << endl;
}
5 1 6 1 2
Im nächsten Codebeispiel werden realistischere Anwendungsfälle mit gleichmäßig verteilten Zufallszahlengeneratoren dargestellt, die die Inhalte eines Vektors und eines Arrays mischen.
// cl.exe /EHsc /nologo /W4 /MTd
#include <algorithm>
#include <array>
#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <functional> // ref()
using namespace std;
template <typename C> void print(const C& c) {
for (const auto& e : c) {
cout << e << " ";
}
cout << endl;
}
template <class URNG>
void test(URNG& urng) {
// Uniform distribution used with a vector
// Distribution is [-5, 5] inclusive
uniform_int_distribution<int> dist(-5, 5);
vector<int> v;
for (int i = 0; i < 20; ++i) {
v.push_back(dist(urng));
}
cout << "Randomized vector: ";
print(v);
// Shuffle an array
// (Notice that shuffle() takes a URNG, not a distribution)
array<string, 26> arr = { { "H", "He", "Li", "Be", "B", "C", "N", "O", "F",
"Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc",
"Ti", "V", "Cr", "Mn", "Fe" } };
shuffle(arr.begin(), arr.end(), urng);
cout << "Randomized array: ";
print(arr);
cout << "--" << endl;
}
int main()
{
// First run: non-seedable, non-deterministic URNG random_device
// Slower but crypto-secure and non-repeatable.
random_device rd;
cout << "Using random_device URNG:" << endl;
test(rd);
// Second run: simple integer seed, repeatable results
cout << "Using constant-seed mersenne twister URNG:" << endl;
mt19937 engine1(12345);
test(engine1);
// Third run: random_device as a seed, different each run
// (Desirable for most purposes)
cout << "Using non-deterministic-seed mersenne twister URNG:" << endl;
mt19937 engine2(rd());
test(engine2);
// Fourth run: "warm-up" sequence as a seed, different each run
// (Advanced uses, allows more than 32 bits of randomness)
cout << "Using non-deterministic-seed \"warm-up\" sequence mersenne twister URNG:" << endl;
array<unsigned int, mt19937::state_size> seed_data;
generate_n(seed_data.begin(), seed_data.size(), ref(rd));
seed_seq seq(begin(seed_data), end(seed_data));
mt19937 engine3(seq);
test(engine3);
}
Using random_device URNG:
Randomized vector: 5 -4 2 3 0 5 -2 0 4 2 -1 2 -4 -3 1 4 4 1 2 -2
Randomized array: O Li V K C Ti N Mg Ne Sc Cl B Cr Mn Ca Al F P Na Be Si Ar Fe S He H
--
Using constant-seed mersenne twister URNG:
Randomized vector: 3 -1 -5 0 0 5 3 -4 -3 -4 1 -3 0 -3 -2 -4 5 1 -1 -1
Randomized array: Al O Ne Si Na Be C N Cr Mn H V F Sc Mg Fe K Ca S Ti B P Ar Cl Li He
--
Using non-deterministic-seed mersenne twister URNG:
Randomized vector: 5 -4 0 2 1 -2 4 4 -4 0 0 4 -5 4 -5 -1 -3 0 0 3
Randomized array: Si Fe Al Ar Na P B Sc H F Mg Li C Ti He N Mn Be O Ca Cr V K Ne Cl S
--
Using non-deterministic-seed "warm-up" sequence mersenne twister URNG:
Randomized vector: -1 3 -2 4 1 3 0 -5 5 -5 0 0 5 0 -3 3 -4 2 5 0
Randomized array: Si C Sc H Na O S Cr K Li Al Ti Cl B Mn He Fe Ne Be Ar V P Ca N Mg F
--
Dieser Code zeigt zwei verschiedene Randomisierungen – Randomisierungen eines Vektors aus Ganzzahlen und Mischung eines Arrays indizierter Daten – mit einer Testvorlagenfunktion. Der erste Aufruf der Testfunktion verwendet den kryptografisch sicheren, nicht-deterministischen, nicht startwert fähigen, nicht wiederholbaren random_device
-URNG. Für den zweiten Testlauf wird das mersenne_twister_engine
als URNG mit einem deterministischen konstanten 32-Bit-Startwert verwendet, was bedeutet, dass die Ergebnisse wiederholbar sind. Der dritte Testlauf startet das mersenne_twister_engine
mit einem nicht-deterministischen 32-Bit-Ergebnis aus random_device
. Der vierte Testlauf baut darauf auf, indem er eine mit random_device
-Ergebnissen gefüllte Startwertsequenz verwendet, die mehr als 32-Bit nicht-deterministische Zufallszahlen ausgibt ( die aber immer noch kryptografisch sicher sind). Weitere Informationen dazu erhalten Sie im Folgenden.
Kategorisierte Auflistung
Uniform Random Number Generators
URNGs werden oft anhand folgender Eigenschaften beschrieben:
Periodenlänge: Anzahl von Iterationen, die für eine Wiederholung der generierten Zahlensequenz erforderlich sind. Je länger, desto besser.
Leistung: Geschwindigkeit und Speicherplatzbedarf der Generierung von Zahlen. Je kürzer, desto besser.
Qualität: Ähnlichkeit der generierten Sequenz mit wirklich zufälligen Zahlen. Dies wird häufig als „Zufallscharakter“ bezeichnet.
In den folgenden Abschnitten werden die Uniform Random Number-Generatoren (URNGs) im <random>
-Header aufgelistet.
Nicht deterministischer Generator
random_device
Klasse
Generiert eine nicht-deterministische und kryptografisch sichere Zufallssequenz mithilfe eines externen Geräts. Wird normalerweise zur Ausstattung einer Engine mit einem Startwert verwendet. Geringe Leistung, sehr hohe Qualität. Weitere Informationen finden Sie in den Hinweisen.
Modultypdefs mit vordefinierten Parametern
Zur Instanzierung von Engines und Engine-Adaptern. Weitere Informationen erhalten Sie im Abschnitt Engines und Verteilungen.
default_random_engine
Die Standard-Engine.typedef mt19937 default_random_engine;
knuth_b
Knuth-Engine.typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;
minstd_rand0
Minimal Standard Engine 1988 (Lewis, Goodman und Miller 1969).typedef linear_congruential_engine<unsigned int, 16807, 0, 2147483647> minstd_rand0;
minstd_rand
Aktualisierter Minimal Standard Engineminstd_rand0
(Park, Miller und Stockmeyer 1993).typedef linear_congruential_engine<unsigned int, 48271, 0, 2147483647> minstd_rand;
mt19937
32-Bit-Mersenne-Twister-Engine (Matsumoto und Nishimura, 1998).typedef mersenne_twister_engine< unsigned int, 32, 624, 397, 31, 0x9908b0df, 11, 0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18, 1812433253> mt19937;
mt19937_64
64-Bit-Mersenne-Twister-Engine (Matsumoto und Nishimura, 2000).typedef mersenne_twister_engine< unsigned long long, 64, 312, 156, 31, 0xb5026f5aa96619e9ULL, 29, 0x5555555555555555ULL, 17, 0x71d67fffeda60000ULL, 37, 0xfff7eee000000000ULL, 43, 6364136223846793005ULL> mt19937_64;
ranlux24
24-Bit-RANLUX-Engine (Martin Lüscher und Fred James, 1994).typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;
ranlux24_base
wird als Grundlage fürranlux24
verwendet.typedef subtract_with_carry_engine<unsigned int, 24, 10, 24> ranlux24_base;
ranlux48
48-Bit-RANLUX-Engine (Martin Lüscher und Fred James, 1994).typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;
ranlux48_base
wird als Grundlage fürranlux48
verwendet.typedef subtract_with_carry_engine<unsigned long long, 48, 5, 12> ranlux48_base;
Modulvorlagen
Engine-Vorlagen werden als eigenständige URNGs verwendet oder als Basis-Engine an Engine-Adapter übergeben. Diese werden normalerweise mit einer vorangestellten Engine-Typdefinition instanziert und an eine Verteilung übergeben. Weitere Informationen erhalten Sie im Abschnitt Engines und Verteilungen.
Name | Beschreibung |
---|---|
linear_congruential_engine Klasse |
Generiert eine zufällige Sequenz mithilfe des linearen Kongruenzalgorithmus. Sehr stark vereinfacht und niedrigste Qualität. |
mersenne_twister_engine Klasse |
Generiert mithilfe des Mersenne-Twisteralgorithmus eine Zufallssequenz. Am komplexesten und mit der höchsten Qualität, außer für die Klasse random_device. Sehr schnelle Leistung. |
subtract_with_carry_engine Klasse |
Generiert eine zufällige Sequenz mithilfe des Algorithmus "subtract with carry". Eine Verbesserung gegenüber linear_congruential_engine , aber von viel geringerer Qualität und Leistung als mersenne_twister_engine . |
Vorlagen für Moduladapter
Engine-Adapter sind Vorlagen, die andere (Basis-)Engines anpassen. Diese werden normalerweise mit einer vorangestellten Engine-Typdefinition instanziert und an eine Verteilung übergeben. Weitere Informationen erhalten Sie im Abschnitt Engines und Verteilungen.
Name | Beschreibung |
---|---|
discard_block_engine Klasse |
Generiert eine zufällige Sequenz, indem die von der Basis-Engine zurückgegebenen Werte verworfen werden. |
independent_bits_engine Klasse |
Generiert eine zufällige Sequenz mit einer angegebenen Anzahl von Bits, indem Bits aus von der Basis-Engine zurückgegebenen Werten erneut verpackt werden. |
shuffle_order_engine Klasse |
Generiert eine zufällige Sequenz durch Neupositionieren der Werte, die von ihrer Basis-Engine zurückgegeben werden. |
Zufallszahlenverteilungen
In den folgenden Abschnitten werden die Verteilungen im <random>
-Header aufgelistet. Verteilungen sind ein Nachverarbeitungsmechanismus, der normalerweise URNS-Ausgaben als Eingaben verwendet und die Ausgabe mithilfe einer Funktion mit definierter statistischer Wahrscheinlichkeitsdichte verteilt. Weitere Informationen erhalten Sie im Abschnitt Engines und Verteilungen.
Gleichförmige Verteilungen.
Name | Beschreibung |
---|---|
uniform_int_distribution Klasse |
Erzeugt eine gleichmäßige Ganzzahlwertverteilung über einen Bereich im geschlossenen Intervall [a, b] (einschließlich einschließlich). |
uniform_real_distribution Klasse |
Produziert eine gleichförmige (Gleitkomma-)Echtwerteverteilung über einen Bereich im halboffenen Intervall [a, b) (inklusiv-exklusiv). |
generate_canonical |
Produziert eine gleiche (Gleitkomma-)Echtwerteverteilung mit vorgegebener Genauigkeit über [0, 1) (inklusiv-exklusiv). |
Bernoulli-Verteilungen
Name | Beschreibung |
---|---|
bernoulli_distribution Klasse |
Produziert eine Bernoulli-Verteilung von bool -Werten. |
binomial_distribution Klasse |
Produziert eine binomiale Verteilung von Ganzzahlwerten. |
geometric_distribution Klasse |
Produziert eine geometrische Verteilung von Ganzzahlwerten. |
negative_binomial_distribution Klasse |
Produziert eine negative binomiale Verteilung von Ganzzahlwerten. |
Normalverteilungen
Name | Beschreibung |
---|---|
cauchy_distribution Klasse |
Produziert eine Couch-Verteilung von (Gleitkomma-)Echtwerten. |
chi_squared_distribution Klasse |
Produziert eine Chi-Quadrat-Verteilung von (Gleitkomma-)Echtwerten. |
fisher_f_distribution Klasse |
Erzeugt eine F-Verteilung (auch bekannt als die F-Verteilung von Snedecor oder die Fisher-Snedecor-Verteilung) von realen (Gleitkommawerten). |
lognormal_distribution Klasse |
Produziert eine Lognormalverteilung von (Gleitkomma-)Echtwerten. |
normal_distribution Klasse |
Produziert eine (Gaußsche) Normalverteilung von (Gleitkomma-)Echtwerten. |
student_t_distribution Klasse |
Produziert die studentische t-Verteilung von (Gleitkomma-)Echtwerten. |
Poisson-Verteilungen
Name | Beschreibung |
---|---|
exponential_distribution Klasse |
Produziert eine exponentielle Verteilung von (Gleitkomma-)Echtwerten. |
extreme_value_distribution Klasse |
Produziert eine Extremwertverteilung von (Gleitkomma-)Echtwerten. |
gamma_distribution Klasse |
Produziert eine Gammaverteilung von (Gleitkomma-)Echtwerten. |
poisson_distribution Klasse |
Produziert eine Poisson-Verteilung von Ganzzahlwerten. |
weibull_distribution Klasse |
Produziert eine Weibull-Verteilung von (Gleitkomma-)Echtwerten. |
Sampling-Verteilungen
Name | Beschreibung |
---|---|
discrete_distribution Klasse |
Produziert eine diskrete Ganzzahlverteilung. |
piecewise_constant_distribution Klasse |
Produziert eine stückweise konstante Verteilung von (Gleitkomma-)Echtwerten. |
piecewise_linear_distribution Klasse |
Produziert eine stückweise lineare Verteilung von (Gleitkomma-)Echtwerten. |
Hilfsfunktionen
In diesem Abschnitt werden die allgemeinen Hilfsfunktionen im <random>
-Header aufgelistet.
Name | Beschreibung |
---|---|
seed_seq Klasse |
Generiert eine nicht-gewichtete verschlüsselte Startwertsequenz. Wird verwendet, um Replikationen von Zufallsvariablenstreams zu vermeiden. Hilfreich, wenn viele URNGs durch Engines instanziert werden. |
Operatoren
In diesem Abschnitt werden die Operation im <random>
-Header aufgelistet.
Name | Beschreibung |
---|---|
operator== |
Testet, ob der URNG links vom Operator gleich der Engine rechts vom Operator ist. |
operator!= |
Testet, ob der URNG links vom Operator ungleich der Engine rechts vom Operator ist. |
operator<< |
Schreibt Zustandsinformationen in einen Stream. |
operator>> |
Extrahiert Zustandsinformationen aus einem Stream. |
Engines und Verteilungen
In den folgenden Abschnitten finden Sie Informationen zu den einzelnen Klassenvorlagenkategorien, die in <random>
. Beide Klassenvorlagenkategorien verwenden einen Typ als Argument und verwenden freigegebene Vorlagenparameternamen, um die Eigenschaften des Typs zu beschreiben, der als tatsächlicher Argumenttyp zulässig ist:
IntType
zeigtshort
,int
,long
,long long
,unsigned short
,unsigned int
,unsigned long
oderunsigned long long
an.UIntType
zeigtunsigned short
,unsigned int
,unsigned long
oderunsigned long long
an.RealType
zeigtfloat
,double
oderlong double
an.
Engines
Engine-Vorlagen und Engine-Adaptervorlagen sind Vorlagen, mit deren Parametern der erstellte Generator angepasst wird.
Ein Modul ist eine Klassen- oder Klassenvorlage, deren Instanzen (Generatoren) als Quelle von Zufallszahlen einheitlich zwischen einem Minimal- und Maximalwert verteilt werden. Ein Engine-Adapter gibt eine Sequenz von Werten aus, die verschiedene Zufallscharaktereigenschaften haben, indem er von einer anderen Zufallswerte-Engine produzierte Werte übernimmt und einen bestimmtem Algorithmus für diese Werte anwendet.
Jede Engine und jeder Engine-Adapter haben die folgenden Member:
typedef
numeric-type
result_type
ist der Typ, der vom Generatoroperator()
zurückgegeben wird. Dernumeric-type
wird als Vorlagenparameter bei der Instanzierung übergeben.result_type operator()
gibt Werte zurück, die gleichmäßig zwischenmin()
undmax()
verteilt werden.result_type min()
gibt den vomoperator()
des Generators zurückgegeben Mindestwert zurück. Engine-Adapter verwenden dasmin()
-Ergebnis der Basis-Engine.result_type max()
gibt den vomoperator()
des Generators zurückgegeben Höchstwert zurück. Wennresult_type
ein Integraltyp (Ganzzahlwerttyp) ist, istmax()
der Höchstwert, der tatsächlich zurückgegeben werden kann (inklusiv). Wennresult_type
ein Gleitkommatyp (Echtwerttyp) ist, istmax()
der kleinste Wert, der größer als alle Werte ist, die zurückgegeben werden können (nicht-inklusiv). Engine-Adapter verwenden dasmax()
-Ergebnis der Basis-Engine.void seed(result_type s)
startet den Generator mit dem Startwerts
. Für Engines lautet die Signatur zur Unterstützung von Standardparameternvoid seed(result_type s = default_seed)
(Engine-Adapter definieren einen separatenvoid seed()
, siehe nächsten Unterabschnitt).template <class Seq> void seed(Seq& q)
samen den Generator mit einerseed_seq
Seq
.Ein expliziter Konstruktor mit dem Argument
result_type x
, mit dem ein Generator erstellt wird, der mit Startwerten versehen ist, als wäreseed(x)
aufgerufen worden.Ein expliziter Konstruktor mit dem Argument
seed_seq& seq
, mit dem ein Generator erstellt wird, der mit Startwerten versehen ist, als wäreseed(seq)
aufgerufen worden.void discard(unsigned long long count)
ruft die Zeiten effektiv aufoperator()
count
und verwirft jeden Wert.
Engine-Adapter unterstützen zusätzlich diese Member (Engine
ist der erste Vorlagenparameter eines Engine-Adapters, der den Typ der Basis-Engine bezeichnet):
Ein Standardkonstruktor zur Initialisierung des Generators genau wie durch den Standardkonstruktor der Basis-Engine.
Ein expliziter Konstruktor mit dem Argument
const Engine& eng
. Dieser dient zur Unterstützung einer Kopienkonstruktion mithilfe der Basis-Engine.Ein expliziter Konstruktor mit dem Argument
Engine&& eng
. Dieser dient zur Unterstützung einer Verschiebungskonstruktion mithilfe der Basis-Engine.void seed()
, der den Generator mit dem Standardstartwert der Basis-Engine initialisiert.const Engine& base()
-Eigenschaftsfunktion, die die Basis-Engine zurückgibt, die zur Konstruktion des Generators verwendet wurde.
Jede Engine besitzt einen Zustand, mit dem die Sequenz der Werte bestimmt wird, die durch nachfolgende Aufrufe von operator()
generiert werden. Die Zustände von zwei Generatoren, die von Engines desselben Typs instanziert wurden, können mithilfe von operator==
und operator!=
verglichen werden. Wenn die beiden Zustände als gleich verglichen werden, generieren Sie dieselbe Sequenz von Werten. Der Zustand eines Objekts kann als Sequenz von 32-Bit-Werten ohne Vorzeichen zu einem Stream gespeichert werden, indem die operator<<
des Generators verwendet werden. Der Zustand wird durch das Speichern nicht geändert. Ein gespeicherter Zustand kann mithilfe von operator>>
in den Generator eingelesen werden, der von einer Engine desselben Typs instanziert wurde.
Verteilungen
Eine Zufallszahlenverteilung ist eine Klasse oder Klassenvorlage, deren Instanzen einen Datenstrom einheitlich verteilter Zufallszahlen aus einem Modul in einen Datenstrom von Zufallszahlen transformieren, die eine bestimmte Verteilung aufweisen. Jede Verteilung verfügt über die folgenden Member:
typedef
numeric-type
result_type
ist der Typ, der von der Verteilungoperator()
zurückgegeben wird. Dernumeric-type
wird als Vorlagenparameter bei der Instanzierung übergeben.template <class URNG> result_type operator()(URNG& gen)
gibt Werte zurück, die entsprechend der Definition der Verteilung verteilt werden, indemgen
als Quelle für gleichmäßig verteilte Zufallswerte und die gespeicherten Parameter der Verteilung verwendet wird.template <class URNG> result_type operator()(URNG& gen, param_type p)
gibt die Werte zurück, die in Übereinstimmung mit der Definition der Verteilung mithilfe vongen
als Quelle für gleichmäßig verteilte Zufallswerte und die Parameterstrukturp
verteilt werden.typedef
unspecified-type
param_type
ist das Paket von Parametern, dieoperator()
optional an die gespeicherten Parameter übergeben werden, und wird anstelle der gespeicherten Parameter verwendet, um den Rückgabewert zu generieren.Ein
const param&
-Konstruktor initialisiert die gespeicherten Parameter aus dem Argument.param_type param() const
ruft die gespeicherten Parameter ab.void param(const param_type&)
legt die gespeicherten Parameter aus dem Argument fest.result_type min()
gibt den vomoperator()
der Verteilung zurückgegeben Mindestwert zurück.result_type max()
gibt den vomoperator()
der Verteilung zurückgegebenen Höchstwert zurück. Wennresult_type
ein Integraltyp (Ganzzahlwerttyp) ist, istmax()
der Höchstwert, der tatsächlich zurückgegeben werden kann (inklusiv). Wennresult_type
ein Gleitkommatyp (Echtwerttyp) ist, istmax()
der kleinste Wert, der größer als alle Werte ist, die zurückgegeben werden können (nicht-inklusiv).void reset()
verwirft alle zwischengespeicherten Werte, damit das Ergebnis des folgenden Aufrufs vonoperator()
nicht von Werten abhängig ist, die vor dem Aufruf aus der Engine bezogen wurden.
Eine Parameterstruktur ist ein Objekt, in dem alle für eine Verteilung erforderlichen Parameter gespeichert werden. Sie enthält folgende Elemente:
typedef
distribution-type
distribution_type
ist die Art der Verteilung.Mindestens ein Konstruktor, der die gleichen Parameterlisten akzeptiert, wie von den Verteilungskonstruktoren akzeptiert werden.
Die gleichen Parameterzugriffsfunktionen wie bei der Verteilung.
Gleichheits- und Ungleichheitsvergleichsoperatoren.
Weitere Informationen erhalten Sie in den entsprechenden Unterthemen unter diesem Thema, auf die zuvor in diesem Artikel verlinkt wurde.
Hinweise
Dies sind zwei höchst hilfereiche URNGs in Visual Studio – mt19937
und random_device
– wie in der Vergleichstabelle gezeigt:
URNG | Schnell | Kryptografisch sicher | Startwertfähig | Deterministisch |
---|---|---|---|---|
mt19937 |
Ja | Keine | Ja | Ja* |
random_device |
Keine | Ja | Nr. | No |
* Wenn mit einem bekannten Startwert ausgestattet.
Obwohl der ISO C++-Standard nicht erfordert, dass random_device
kryptografisch sicher ist, wird es in Visual Studio implementiert, um kryptografische Sicherheit herzustellen. (Der Begriff "kryptografisch sicher" impliziert keine Garantien, sondern bezieht sich auf ein Mindestmaß an Entropie – und somit auf die Grad der Vorhersagbarkeit – ein gegebener Zufallsalgorithmus. Weitere Informationen finden Sie im Wikipedia-Artikel kryptografisch sichere Pseudorandomnummerngenerator.) Da der ISO C++-Standard dies nicht erfordert, können andere Plattformen als einfacher Pseudo-Zufallszahlengenerator (nicht kryptografisch sicher) implementiert random_device
werden und können nur als Seedquelle für einen anderen Generator geeignet sein. Lesen Sie die Dokumentation für diese Plattformen, wenn Sie random_device
plattformübergreifend verwenden.
random_device
-Ergebnisse sind per Definition nicht reproduzierbar, und ein Nebeneffekt ist, dass er eventuell deutlich langsamer läuft als andere URNGs. Die meisten Anwendungen, für die keine kryptografische Sicherheit erforderlich sind, verwenden mt19937
oder eine ähnliche Engine, obwohl Sie sie vielleicht mit einem Aufruf von random_device
starten möchten, wie im Codebeispiel gezeigt.