Wie man eine Zufallszahl zwischen 0 und 1 in C++ generiert

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die C++11-Bibliothek <random>, um eine Zufallszahl zwischen 0 und 1 zu erzeugen
  2. Verwenden Sie die Funktion std::rand, um eine zufällige Gleitkommazahl zwischen 0 und 1 in C++ zu erzeugen
Wie man eine Zufallszahl zwischen 0 und 1 in C++ generiert

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Float