Shuffle Vector in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo shuffle per mescolare gli elementi vettoriali
  2. Usa l’algoritmo random_shuffle per mescolare gli elementi vettoriali
Shuffle Vector in C++

Questo articolo illustrerà più metodi su come mescolare gli elementi vettoriali in C++.

Usa l’algoritmo shuffle per mescolare gli elementi vettoriali

std::shuffle fa parte della libreria C++<algorithm>e implementa la caratteristica di permutazione casuale, che può essere applicata agli elementi dell’intervallo dato. La funzione accetta gli iteratori di intervallo come primi due argomenti e il generatore di numeri casuali come terzo. Un generatore di numeri casuali è un oggetto funzione. Il C++ contemporaneo consiglia di utilizzare le utilità di libreria standard per la generazione di numeri casuali. std::random_device dovrebbe essere utilizzato per la generazione di numeri non deterministici.

Infine, l’oggetto motore di numeri casuali scelto deve essere creato e passato all’algoritmo shuffle per generare una permutazione casuale dell’intervallo. Nota che stampiamo un vettore di numeri interi prima e dopo che è stato eseguito lo shuffling.

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

Produzione:

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

In alternativa al metodo precedente, si può implementare la stessa subroutine usando gli oggetti std::begin e std::end per passare gli iteratori di range alla funzione shuffle. L’esempio seguente potrebbe essere una versione più generica per scenari di codifica specifici.

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

Produzione:

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

Usa l’algoritmo random_shuffle per mescolare gli elementi vettoriali

std::random_shuffle è un altro algoritmo di utilità della libreria standard C++. La vecchia versione di std::shuffle è stata deprezzata per i più recenti standard C++. Sebbene possa essere utilizzato in più ambienti di codifica legacy in cui sono disponibili versioni C++ precedenti.

random_shuffle può accettare un generatore di numeri casuali fornito dall’utente, ma poiché le versioni precedenti di C++ mancavano delle funzionalità di libreria casuale, si possono fornire solo iteratori di intervallo alla funzione. In quest’ultimo caso, random_shuffle utilizza un generatore di numeri casuali definito dall’implementazione, che a volte è la chiamata alla funzione 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;
}

Produzione:

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

Articolo correlato - C++ Vector