Wie man eine Random-Float-Zahl in C++ generiert

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die C++11-Bibliothek <random>, um eine Zufalls-Float-Zahl zu erzeugen
  2. Verwenden Sie die Funktion rand, um eine zufällige Gleitkommazahl zu erzeugen
Wie man eine Random-Float-Zahl in C++ generiert

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;
}
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