Comment générer un nombre aléatoire entre 0 et 1 en C++

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

Cet article explique plusieurs méthodes C++ sur la façon dont vous pouvez générer un flottement aléatoire dans un intervalle de 0 à 1.

Utilisez la bibliothèque C++11 <random> pour générer un nombre aléatoire entre 0 et 1

La version C++11 fournit des classes/méthodes pour la génération de nombres aléatoires et pseudo-aléatoires. Ces bibliothèques standard sont recommandées pour gérer la génération de nombres aléatoires dans la base de code C++ moderne.

L’objet std::random_device est initialisé en premier ; c’est un générateur de bits aléatoires uniforme non déterministe utilisé pour amorcer le moteur de nombres aléatoires std::default_random_engine, qui est initialisé sur la ligne suivante. De cette façon, on s’assure que le moteur ne produira pas les mêmes séquences de nombres.
Il existe plusieurs moteurs de nombres aléatoires qui sont implémentés dans la bibliothèque C++ <random>, et ils diffèrent par quelques facteurs comme les exigences en matière de temps/espace (voir la liste complète ici). Dans l’exemple suivant, nous démontrons la génération de nombres aléatoires en utilisant std::default_random_engine. On peut spécifier un certain moteur d’algorithme selon les contraintes de l’application. L’étape suivante consiste à initialiser une distribution uniforme et à passer des valeurs min/max comme arguments. Enfin, nous imprimons 5 valeurs floats aléatoires dans un intervalle de [0-1] à la console.

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

Production:

0.22808
0.343274
0.408204
0.687902
0.572947

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 modèle : float, double, ou long double à.

Utilisez la fonction std::rand pour générer un float aléatoire entre 0 et 1 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é. Néanmoins, elle peut être utilisée à des fins de test ou de génération de nombres cryptographiquement non sensibles.

La fonction rand 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. Gardez à l’esprit que cette fonction doit être ensemencée avec std::srand (de préférence en passant l’heure actuelle en utilisant std::time). Enfin, nous pouvons générer des valeurs à virgule float dans l’intervalle de [0-1].

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

Production:

0.483029
0.252537
0.264023
0.90233
0.573071
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++ Float