Mélange de vecteurs en C++

Jinku Hu 12 octobre 2023
  1. Utiliser l’algorithme de shuffle pour mélanger des éléments vectoriels
  2. Utiliser l’algorithme random_shuffle pour mélanger des éléments vectoriels
Mélange de vecteurs en C++

Cet article présente plusieurs méthodes pour mélanger des éléments vectoriels en C++.

Utiliser l’algorithme de shuffle pour mélanger des éléments vectoriels

La fonction std::shuffle fait partie de la bibliothèque C++ <algorithm> et implémente la fonction de permutation aléatoire, qui peut être appliquée aux éléments de la gamme donnée. La fonction prend les itérateurs de plage comme les deux premiers arguments et le générateur de nombres aléatoires comme le troisième. Un générateur de nombres aléatoires est un objet de fonction. Le C++ contemporain recommande d’utiliser les utilitaires standard de la bibliothèque de génération de nombres aléatoires. Il faut utiliser std::random_device pour la génération de nombres non déterministes.

Enfin, l’objet moteur de nombres aléatoires choisi doit être créé et passé à l’algorithme shuffle pour générer une permutation aléatoire de la plage. Notez que nous imprimons un vecteur d’entiers avant et après que la permutation ait été effectuée.

#include <algorithm>
#include <iostream>
#include <random>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1           : ";
  printVectorElements(i_vec1);

  std::random_device rd;
  std::default_random_engine rng(rd());
  shuffle(i_vec1.begin(), i_vec1.end(), rng);

  cout << "i_vec1 (shuffled): ";
  printVectorElements(i_vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 53; 32; 84; 23; 12; 43; 65;

Comme alternative à la méthode précédente, on peut implémenter la même sous-routine en utilisant les objets std::begin et std::end pour passer les itérateurs de plage à la fonction shuffle. L’exemple suivant pourrait être une version plus générique pour des scénarios de codage spécifiques.

#include <algorithm>
#include <iostream>
#include <random>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1           : ";
  printVectorElements(i_vec1);

  std::random_device rd;
  std::default_random_engine rng(rd());
  shuffle(std::begin(i_vec1), std::end(i_vec1), rng);

  cout << "i_vec1 (shuffled): ";
  printVectorElements(i_vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 43; 23; 32; 65; 53; 12; 84;

Utiliser l’algorithme random_shuffle pour mélanger des éléments vectoriels

std::random_shuffle est un autre algorithme utilitaire de la bibliothèque standard C++. L’ancienne version de std::shuffle a été dépréciée pour les derniers standards C++. Bien qu’elle puisse être utilisée dans des environnements de codage plus anciens où des versions C++ plus anciennes sont disponibles.

Le random_shuffle peut prendre un générateur de nombres aléatoires fourni par l’utilisateur, mais comme les anciennes versions du C++ ne disposaient pas de la bibliothèque aléatoire, on ne peut fournir que des itérateurs de plage à la fonction. Dans ce dernier cas, random_shuffle utilise un générateur de nombres aléatoires défini par l’implémentation, qui se trouve parfois être l’appel de fonction std::rand.

#include <algorithm>
#include <iostream>
#include <random>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::shuffle;
using std::string;
using std::vector;

template <typename T>
void printVectorElements(vector<T> &vec) {
  for (auto i = 0; i < vec.size(); ++i) {
    cout << vec.at(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> i_vec1 = {12, 32, 43, 53, 23, 65, 84};

  cout << "i_vec1           : ";
  printVectorElements(i_vec1);

  std::random_shuffle(i_vec1.begin(), i_vec1.end());

  cout << "i_vec1 (shuffled): ";
  printVectorElements(i_vec1);
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

i_vec1           : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 23; 53; 32; 84; 12; 65; 43;
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++ Vector