Shuffle Vector in C++
-
Usa l’algoritmo
shuffle
per mescolare gli elementi vettoriali -
Usa l’algoritmo
random_shuffle
per mescolare gli elementi vettoriali
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;
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