Comment générer un double aléatoire en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la bibliothèque C++11 <random> pour générer un double aléatoire en C++
  2. Utilisez la fonction std::rand pour générer un double aléatoire en C++
Comment générer un double aléatoire en C++

Cet article explique plusieurs méthodes pour générer des nombres aléatoires double à virgule float en C++.

Utiliser la bibliothèque C++11 <random> pour générer un double aléatoire en C++

Depuis la version C++11, la bibliothèque standard fournit des classes et des méthodes pour la génération de nombres aléatoires/pseudo-aléatoires. Toute application nécessitant des nombres aléatoires de haute qualité doit utiliser ces méthodes, mais d’autres cas peuvent également bénéficier de cette interface STL propre et riche en fonctionnalités.

L’objet std::random_device, qui est initialisé au départ, est un générateur de bits aléatoires uniformes non déterministes utilisé pour amorcer le moteur de nombres aléatoires std::default_random_engine initialisé sur la ligne suivante. Cette étape permet de s’assurer que le moteur ne produit pas les mêmes séquences. Plusieurs moteurs de nombres aléatoires sont implémentés dans la bibliothèque numérique C++, et ils diffèrent en termes d’exigences temps/espace (voir la liste complète ici).

Dans l’exemple suivant, nous utilisons std::default_random_engine pour générer des valeurs pseudo-aléatoires, mais vous pouvez initialiser le moteur d’algorithme spécifique selon les contraintes de votre application. Ensuite, nous initialisons une distribution uniforme et passons les valeurs min/max comme arguments optionnels. Enfin, nous imprimons 5 valeurs doubles aléatoires d’intervalle [10-100] à la console.

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

Production:

73.68930968
24.37712986
40.37815433
77.24899374
94.62192505

Notez que std::uniform_real_distribution< T > donne un comportement indéfini si un des types suivants n’est pas passé comme paramètre de template : float, double, ou long double. L’exemple suivant génère des nombres à virgule float de précision unique:

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

Utilisez la fonction std::rand pour générer un double aléatoire en C++

La fonction rand fait partie des installations de génération de nombres aléatoires de la bibliothèque standard C. Elle n’est pas recommandée pour les applications nécessitant un caractère aléatoire de haute qualité, mais peut être utilisée pour de multiples scénarios, par exemple si l’on veut remplir des matrices ou des vecteurs avec des nombres aléatoires.

Cette fonction génère un nombre entier pseudo-aléatoire entre 0 et RAND_MAX (les deux inclus). Puisque la valeur de RAND_MAX dépend de l’implémentation, et que la valeur minimale garantie est seulement de 32767, les nombres générés ont un caractère aléatoire contraint. Cette fonction devrait être ensemencée avec std::srand (de préférence en passant le temps actuel en utilisant std::time). Enfin, nous pouvons générer des valeurs à virgule float de double précision avec une arithmétique un peu lourde.

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

Production:

84.70076228
11.08804226
20.78055909
74.35545741
18.64741151
Auteur: 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

Article connexe - C++ Double