Vector aleatorio en C++

Jinku Hu 12 octubre 2023
  1. Usar el algoritmo shuffle para barajar los elementos vectoriales
  2. Usar el algoritmo random_shuffle para barajar los elementos del vector
Vector aleatorio en C++

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;
Autor: 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

Artículo relacionado - C++ Vector