Wie man eine Zufallszahl zwischen 0 und 1 in C++ generiert
-
Verwenden Sie die C++11-Bibliothek
<random>
, um eine Zufallszahl zwischen 0 und 1 zu erzeugen -
Verwenden Sie die Funktion
std::rand
, um eine zufällige Gleitkommazahl zwischen 0 und 1 in C++ zu erzeugen
In diesem Artikel werden mehrere C++-Methoden erläutert, wie Sie eine zufällige Gleitkommazahl im 0-zu-1-Intervall erzeugen können.
Verwenden Sie die C++11-Bibliothek <random>
, um eine Zufallszahl zwischen 0 und 1 zu erzeugen
Die C++11-Version bietet Klassen/Methoden für die Generierung von Zufalls- und Pseudozufallszahlen. Diese Standard-Bibliothekseinrichtungen werden für die Handhabung der Zufallszahlengenerierung in der modernen C++-Codebasis empfohlen.
Das Objekt std::random_device
wird zuerst initialisiert; es ist ein nicht-deterministischer, einheitlicher Zufallsbitgenerator, der verwendet wird, um die Zufallszahlengine std::default_random_engine
zu setzen, die in der nächsten Zeile initialisiert wird. Auf diese Weise wird sichergestellt, dass die Engine nicht die gleichen Zahlenfolgen produziert.
Es gibt mehrere Zufallszahlengines, die in der C++ <random>
Bibliothek implementiert sind, und sie unterscheiden sich in einigen Faktoren wie Zeit/Raum-Anforderungen (siehe die vollständige Liste hier). Im folgenden Beispiel demonstrieren wir die Erzeugung von Zufalls-Float mit std::default_random_engine
. Man kann eine bestimmte Algorithmus-Engine so spezifizieren, wie es die Anwendungsbedingungen erfordern. Der nächste Schritt ist die Initialisierung einer Gleichverteilung und die Übergabe von Min/Max-Werten als Argumente. Schließlich geben wir 5 zufällige Float-Werte im Intervall [0-1] an die Konsole aus.
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;
int main() {
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<float> distr(FLOAT_MIN, FLOAT_MAX);
for (int n = 0; n < 5; ++n) {
cout << setprecision(6) << distr(eng) << "\n";
}
return EXIT_SUCCESS;
}
Ausgabe:
0.22808
0.343274
0.408204
0.687902
0.572947
Beachten Sie, dass std::uniform_real_distribution< T >
ein undefiniertes Verhalten ergibt, wenn einer der folgenden Typen nicht als Schablonenparameter übergeben wird: float
, double
oder long double
an.
Verwenden Sie die Funktion std::rand
, um eine zufällige Gleitkommazahl zwischen 0 und 1 in C++ zu erzeugen
Die rand
-Funktion ist ein Teil der Zufallszahlenerzeugungsmöglichkeiten der C-Standardbibliothek. Sie wird nicht für Anwendungen empfohlen, die Zufallszahlen von hoher Qualität erfordern. Dennoch kann sie zu Testzwecken oder zur Generierung kryptographisch nicht sensitiver Zahlen verwendet werden.
Die Funktion rand
erzeugt eine pseudozufällige ganze Zahl zwischen 0 und RAND_MAX
(beide eingeschlossen). Da der RAND_MAX
-Wert implementierungsabhängig ist und der garantierte Mindestwert nur 32767 beträgt, haben generierte Zahlen eine eingeschränkte Zufälligkeit. Denken Sie daran, dass diese Funktion mit std::srand
gesetzt werden muss (vorzugsweise wird die aktuelle Zeit mit std::time
übergeben). Schließlich können wir Fließkommazahlen im Intervall von [0-1] erzeugen.
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 0;
constexpr int FLOAT_MAX = 1;
int main() {
std::srand(std::time(nullptr));
for (int i = 0; i < 5; i++)
cout << setprecision(6)
<< FLOAT_MIN +
(float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
<< endl;
return EXIT_SUCCESS;
}
Ausgabe:
0.483029
0.252537
0.264023
0.90233
0.573071
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