Wie man Zufallszahlen im Bereich in C++ generiert
-
Verwenden Sie die C++11-Bibliothek
<random>
, um eine Zufallszahl im Bereich zu erzeugen -
Benutzen Sie die
rand
-Funktion, um eine Zufallszahl im Bereich zu erzeugen
In diesem Artikel werden mehrere C++-Methoden zur Erzeugung von Zufallszahlen in einem bestimmten Zahlenintervall vorgestellt.
Verwenden Sie die C++11-Bibliothek <random>
, um eine Zufallszahl im Bereich zu erzeugen
C++ fügte die Standardbibliotheksfunktionen für die Zufallszahlengenerierung mit C++11 unter einer neuen Überschrift <random>
hinzu. Die RNG-Workflow-Funktionen, die durch den <random>
-Header bereitgestellt werden, sind in zwei Teile unterteilt: Zufallsgenerator und Verteilung. Die Random-Engine ist für die Rückgabe eines unvorhersehbaren Bitstroms verantwortlich. Die Verteilung liefert Zufallszahlen (vom Typ, wie vom Benutzer festgelegt), die die spezifische Wahrscheinlichkeitsverteilung erfüllen, z. B. gleichförmig, normal oder andere.
Zuerst sollte der Benutzer die Random Engine mit dem Startwert initialisieren. Es wird empfohlen, die Engine mit std::random_device
, der systemspezifischen Quelle für nicht-deterministische Zufallsbits, zu initialisieren. Dadurch kann die Engine bei jedem Durchlauf unterschiedliche Zufallsbitströme erzeugen. Wenn der Benutzer andererseits die gleichen Sequenzen über mehrere Programmläufe hinweg erzeugen muss, sollte die Random-Engine mit der Konstante int
initialisiert werden.
Als nächstes wird das Verteilungsobjekt mit Argumenten von Min/Max-Werten für ein Intervall initialisiert, aus dem die Zufallszahlen generiert werden. Im folgenden Beispiel verwenden wir uniform_int_distribution
und geben 10 ganze Zahlen aus, um willkürlich zu konsultieren.
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_int_distribution<int> distr(MIN, MAX);
for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
cout << distr(eng) << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
57; 38; 8; 69; 5; 27; 65; 65; 73; 4;
<random>
Header bietet mehrere Zufallsgeneratoren mit unterschiedlichen Algorithmen und Effizienzkompromissen. Daher kann man die spezifische Zufallsmaschine initialisieren, wie im nächsten Codebeispiel gezeigt:
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::random_device rd;
std::mt19937 eng(rd());
std::uniform_int_distribution<int> distr(MIN, MAX);
for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
cout << distr(eng) << "; ";
}
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
59; 47; 81; 41; 28; 88; 10; 12; 86; 7;
Benutzen Sie die rand
-Funktion, um eine Zufallszahl im Bereich zu erzeugen
Die Funktion rand
ist Teil der C-Standardbibliothek und kann aus dem C++-Code aufgerufen werden. Obwohl es nicht empfehlenswert ist, die Funktion rand
für die Generierung von Zufallszahlen hoher Qualität zu verwenden, kann sie doch zum Füllen von Arrays oder Matrizen mit beliebigen Daten für verschiedene Zwecke verwendet werden. In diesem Beispiel erzeugt die Funktion eine zufällige ganze Zahl zwischen 0 und dem MAX
-Zahlenintervall. Beachten Sie, dass diese Funktion mit std::srand
gesetzt werden sollte (vorzugsweise sollte die aktuelle Zeit mit std::time(nullptr)
übergeben werden), um verschiedene Werte über die mehreren Läufe hinweg zu erzeugen, und erst dann können wir den rand
aufrufen.
#include <ctime>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
constexpr int MIN = 1;
constexpr int MAX = 100;
constexpr int RAND_NUMS_TO_GENERATE = 10;
int main() {
std::srand(std::time(nullptr));
for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++) cout << rand() % MAX << "; ";
cout << endl;
return EXIT_SUCCESS;
}
Ausgabe:
36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook