Comment générer un nombre aléatoire dans une plage en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la bibliothèque C++11 <random> pour générer un nombre aléatoire dans un intervalle
  2. Utiliser la fonction rand pour générer un nombre aléatoire dans la plage
Comment générer un nombre aléatoire dans une plage en C++

Cet article présente plusieurs méthodes C++ sur la manière de générer des nombres aléatoires dans un intervalle de nombres spécifié.

Utiliser la bibliothèque C++11 <random> pour générer un nombre aléatoire dans un intervalle

Le C++ a ajouté une bibliothèque standard pour la génération de nombres aléatoires avec la version C++11 sous un nouvel en-tête <random>. Les fonctionnalités de flux de travail RNG fournies par l’en-tête <random> sont divisées en deux parties : le moteur aléatoire et la distribution. Le moteur aléatoire est responsable du retour d’un flux binaire imprévisible. La distribution retourne des nombres aléatoires (du type spécifié par l’utilisateur) qui satisfont la distribution de probabilité spécifique, par exemple uniforme, normale ou autre.

Dans un premier temps, l’utilisateur doit initialiser le moteur aléatoire avec la valeur d’amorçage. Il est recommandé d’initialiser le moteur avec std::random_device, la source spécifique au système pour les bits aléatoires non déterministes. Cela permet au moteur de générer différents flux de bits aléatoires à chaque exécution. D’autre part, si l’utilisateur a besoin de générer les mêmes séquences à travers plusieurs exécutions du programme, le moteur aléatoire doit être initialisé avec la constante int littérale.

Ensuite, l’objet de distribution est initialisé avec des arguments de valeurs min/max pour un intervalle, à partir duquel les nombres aléatoires sont générés. Dans l’exemple suivant, nous utilisons uniform_int_distribution et nous produisons 10 entiers pour la console arbitrairement.

#include <iostream>
#include <random>

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

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

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

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

57; 38; 8; 69; 5; 27; 65; 65; 73; 4;

L’en-tête <random> fournit plusieurs moteurs aléatoires avec différents algorithmes et compromis d’efficacité. Ainsi, on peut initialiser le moteur aléatoire spécifique, comme indiqué dans l’échantillon de code suivant :

#include <iostream>
#include <random>

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

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::random_device rd;
  std::mt19937 eng(rd());
  std::uniform_int_distribution<int> distr(MIN, MAX);

  for (int n = 0; n < RAND_NUMS_TO_GENERATE; ++n) {
    cout << distr(eng) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

59; 47; 81; 41; 28; 88; 10; 12; 86; 7;

Utiliser la fonction rand pour générer un nombre aléatoire dans la plage

La fonction rand fait partie de la bibliothèque standard C et peut être appelée à partir du code C++. Bien qu’il ne soit pas recommandé d’utiliser la fonction rand pour la génération de nombres aléatoires de haute qualité, elle peut être utilisée pour remplir des tableaux ou des matrices avec des données arbitraires dans différents buts. Dans cet exemple, la fonction génère un nombre entier aléatoire entre 0 et l’intervalle de nombre MAX. Notez que cette fonction doit être ensemencée avec std::srand (de préférence en passant le temps actuel avec std::time(nullptr)) pour générer différentes valeurs à travers les multiples exécutions, et seulement alors nous pouvons appeler le rand.

#include <ctime>
#include <iostream>
#include <random>

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

constexpr int MIN = 1;
constexpr int MAX = 100;

constexpr int RAND_NUMS_TO_GENERATE = 10;

int main() {
  std::srand(std::time(nullptr));
  for (int i = 0; i < RAND_NUMS_TO_GENERATE; i++) cout << rand() % MAX << "; ";
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

36; 91; 99; 40; 3; 60; 90; 63; 44; 22;
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++ Random