Vector aleatorio en C++
-
Usar el algoritmo
shuffle
para barajar los elementos vectoriales -
Usar el algoritmo
random_shuffle
para barajar los elementos del vector
Este artículo demostrará múltiples métodos sobre cómo barajar elementos vectoriales en C++.
Usar el algoritmo shuffle
para barajar los elementos vectoriales
std::shuffle
es parte de la biblioteca de C++ <algorithm>
e implementa la característica de permutación aleatoria, que puede ser aplicada a los elementos del rango dado. La función toma los iteradores de rango como los dos primeros argumentos y el generador de números aleatorios como el tercero. El generador de números aleatorios es un objeto de la función. Contemporáneo C++ recomienda utilizar las utilidades de biblioteca estándar de generación de números aleatorios. std::random_device
debe ser utilizado para la generación de números no determinantes.
Finalmente, el objeto motor de números aleatorios elegido debe ser creado y pasado al algoritmo shuffle
para generar una permutación aleatoria del rango. Nótese que imprimimos un vector de números enteros antes y después de que se haya realizado la mezcla.
#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;
}
Producción :
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 53; 32; 84; 23; 12; 43; 65;
Como alternativa al método anterior, se puede implementar la misma subrutina usando los objetos std::begin
y std::end
para pasar los iteradores de rango a la función shuffle
. El siguiente ejemplo podría ser una versión más genérica para escenarios de codificación específicos.
#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;
}
Producción :
i_vec1 : 12; 32; 43; 53; 23; 65; 84;
i_vec1 (shuffled): 43; 23; 32; 65; 53; 12; 84;
Usar el algoritmo random_shuffle
para barajar los elementos del vector
std::random_shuffle
es otro algoritmo de utilidad de la biblioteca estándar de C++. La versión antigua del std::shuffle
ha sido depreciada por los nuevos estándares de C++. Aunque puede ser utilizado en más entornos de codificación de legado donde las versiones antiguas de C++ están disponibles.
random_shuffle
puede tomar el generador de números aleatorios proporcionado por el usuario, pero como las versiones antiguas de C++ carecían de las facilidades de la librería aleatoria, uno puede proporcionar sólo iteradores de rango a la función. En este último caso, random_shuffle
utiliza un generador de números aleatorios definido por la implementación, que a veces resulta ser la llamada a la función 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;
}
Producción :
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