Wie man zufälliges Double in C++ erzeugt

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die C++11 <random> Bibliothek, um ein zufälliges double in C++ zu erzeugen
  2. Verwenden Sie die Funktion std::rand, um ein zufälliges Double in C++ zu erzeugen
Wie man zufälliges Double in C++ erzeugt

In diesem Artikel werden mehrere Methoden zur Erzeugung von zufälligen double Fließkommazahlen in C++ erläutert.

Verwenden Sie die C++11 <random> Bibliothek, um ein zufälliges double in C++ zu erzeugen

Seit der C++11-Version bietet die Standardbibliothek Klassen und Methoden zur Generierung von Zufalls-/Pseudozufallszahlen. Jede Anwendung, die qualitativ hochwertige Zufallszahlen benötigt, muss diese Methoden verwenden, aber auch andere Fälle können von dieser sauberen und funktionsreichen STL-Schnittstelle profitieren.

Das Objekt std::random_device, das zunächst initialisiert wird, ist ein nicht-deterministischer, einheitlicher Zufallsbitgenerator, der verwendet wird, um die in der nächsten Zeile initialisierte Zufallszahlengine std::default_random_engine zu setzen. Dieser Schritt stellt sicher, dass die Engine nicht die gleichen Sequenzen erzeugt. In der C++-Numerikbibliothek sind mehrere Zufallszahlengines implementiert, die sich hinsichtlich der Zeit/Raum-Anforderungen unterscheiden (siehe die vollständige Liste hier).

Im folgenden Beispiel verwenden wir std::default_random_engine, um Pseudozufallswerte zu erzeugen, aber Sie können die spezifische Algorithmus-Engine so initialisieren, wie es Ihre Anwendungsbedingungen erfordern. Als nächstes initialisieren wir eine Gleichverteilung und übergeben Min/Max-Werte als optionale Argumente. Schließlich drucken wir 5 zufällige Doppelwerte aus dem Intervall [10-100] auf die Konsole.

#include <iomanip>
#include <iostream>
#include <random>

using std::cout;
using std::endl;
using std::setprecision;

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<double> distr(MIN, MAX);

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

73.68930968
24.37712986
40.37815433
77.24899374
94.62192505

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. Das folgende Beispiel erzeugt Fließkommazahlen einfacher Genauigkeit:

#include <iomanip>
#include <iostream>
#include <random>

using std::cout;
using std::endl;
using std::setprecision;

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::random_device rd;
  std::default_random_engine eng(rd());
  std::uniform_real_distribution<float> distr(MIN, MAX);

  for (int n = 0; n < 5; ++n) {
    cout << setprecision(10) << distr(eng) << "\n";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Verwenden Sie die Funktion std::rand, um ein zufälliges Double in C++ zu erzeugen

Die rand-Funktion ist Teil der Zufallszahlenerzeugungsmöglichkeiten der C-Standardbibliothek. Sie wird nicht für Anwendungen empfohlen, die Zufallszahlen von hoher Qualität erfordern, kann aber für mehrere Szenarien verwendet werden, z. B. wenn man Matrizen oder Vektoren mit Zufallszahlen füllen möchte.

Diese Funktion erzeugt eine Pseudo-Zufallszahl zwischen 0 und RAND_MAX (beide eingeschlossen). Da der RAND_MAX-Wert implementierungsabhängig ist und der garantierte Mindestwert nur 32767 beträgt, haben die erzeugten Zahlen eine eingeschränkte Zufälligkeit. Diese Funktion sollte mit std::srand gesetzt werden (vorzugsweise sollte die aktuelle Zeit mit std::time übergeben werden). Schließlich können wir mit etwas umständlicher Arithmetik Fließkommazahlen mit doppelter Genauigkeit erzeugen.

#include <iomanip>
#include <iostream>
#include <random>

using std::cout;
using std::endl;
using std::setprecision;

// Modify as needed
constexpr int MIN = 10;
constexpr int MAX = 100;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < 5; i++)
    cout << setprecision(10)
         << MIN + (double)(rand()) / ((double)(RAND_MAX / (MAX - MIN))) << endl;
  return EXIT_SUCCESS;
}

Ausgabe:

84.70076228
11.08804226
20.78055909
74.35545741
18.64741151
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++ Double