Wie man eine Random-Float-Zahl in C++ generiert
-
Verwenden Sie die C++11-Bibliothek
<random>
, um eine Zufalls-Float-Zahl zu erzeugen -
Verwenden Sie die Funktion
rand
, um eine zufällige Gleitkommazahl zu erzeugen
In diesem Artikel werden mehrere Methoden zur Erzeugung einer zufälligen Gleitkommazahl in C++ erläutert.
Verwenden Sie die C++11-Bibliothek <random>
, um eine Zufalls-Float-Zahl zu erzeugen
Diese Methode ist die empfohlene Methode zur Erzeugung qualitativ hochwertiger Zufallszahlen in zeitgenössischem C++. Zuerst sollte das std::random_device
Objekt initialisiert werden. Es erzeugt nicht-deterministische Zufallsbits für das random engine seeding, was entscheidend ist, um zu vermeiden, dass die gleichen Zahlenfolgen erzeugt werden. In diesem Beispiel verwenden wir std::default_random_engine
, um Pseudo-Zufallswerte zu erzeugen, aber Sie können eine bestimmte Algorithmus-Engine deklarieren (siehe die vollständige Liste hier). Als nächstes initialisieren wir eine Gleichverteilung und übergeben Min/Max-Werte als optionale Argumente.
Als Ergebnis geben wir 5 Zufalls-Floats an die Konsole aus.
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;
int main() {
std::random_device rd;
std::default_random_engine eng(rd());
std::uniform_real_distribution<> distr(FLOAT_MIN, FLOAT_MAX);
for (int n = 0; n < 5; ++n) {
cout << setprecision(10) << distr(eng) << "\n";
}
return EXIT_SUCCESS;
}
Ausgabe:
19.54383877
92.41870106
92.42645927
93.53035308
39.09127952
Die vorherige Version erzeugt tatsächlich Fließkommazahlen doppelter Genauigkeit (64 Bits
). Sie können den Fließkomma-Typ anpassen, indem Sie float
, double
oder long double
auf std::uniform_real_distribution< T >
setzen. Beachten Sie jedoch, dass das Argument, wenn es nicht eines dieser Argumente ist, zu einem undefinierten Verhalten führt. Das folgende Beispiel erzeugt Fließkommazahlen mit einfacher Genauigkeit:
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;
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(10) << distr(eng) << "\n";
}
return EXIT_SUCCESS;
}
Verwenden Sie die Funktion rand
, um eine zufällige Gleitkommazahl zu erzeugen
Die rand
-Funktion stammt aus der C-Bibliothek und wird nicht empfohlen, wenn die Qualitätszufälligkeit erforderlich ist. Diese Funktion erzeugt eine pseudozufällige ganze Zahl zwischen 0 und RAND_MAX
(beide eingeschlossen). Da der Wert von RAND_MAX
implementierungsabhängig ist und der garantierte Mindestwert nur 32767 beträgt, haben Zahlen, die von rand
erzeugt werden, eine eingeschränkte Zufälligkeit. Beachten Sie, dass diese Funktion mit std::srand
gesetzt werden sollte (vorzugsweise mit dem Argument der aktuellen Zeit), und dann können wir zufällige Fließkommazahlen mit etwas umständlicher Arithmetik erzeugen.
#include <iomanip>
#include <iostream>
#include <random>
using std::cout;
using std::endl;
using std::setprecision;
constexpr int FLOAT_MIN = 10;
constexpr int FLOAT_MAX = 100;
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(10) << distr(eng) << "\n";
}
cout << endl;
std::srand(std::time(nullptr));
for (int i = 0; i < 5; i++)
cout << setprecision(10)
<< FLOAT_MIN +
(float)(rand()) / ((float)(RAND_MAX / (FLOAT_MAX - FLOAT_MIN)))
<< endl;
return EXIT_SUCCESS;
}
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 FacebookVerwandter Artikel - C++ Float
- Einstellen der Präzision von Fließkommazahlen in C++
- Runden von Fließkommazahlen auf 2 Dezimalstellen in C++
- Wie konvertiert man Float nach Int in C++
- Wie man eine Zufallszahl zwischen 0 und 1 in C++ generiert
- Wie konvertiert man Float in String in C++
- Wie druckt man Zahlen mit angegebenen Dezimalpunkten in C++