Para barajar, yo lo que hago es ir cogiendo elementos, e ir colocándolos en un array en posiciones aleatorias.
O lo que es lo mismo, ir cogiendo elementos aleatorios, e ir introduciéndolos en el array.
Así para barajar en un tiempo finito.
Pero estás duplicando el array así... Para eso intercambias y ya esta.
Creo que últimamente menospreciamos la potencia de proceso de nuestros PC.
Como media a mi me tarda menos de 0.020s.
Ya hace un tiempo hubo una discusión acerca de cuánto tiempo se emplearía en rellenar, con el mismo método, una matriz 10x10 con números del 1 al 1000 y andaba por los 0.012s y acabó en este otro tema.
Salu2!. Por supuesto, pero siempre se busca la máxima eficiencia.
Suponte un servidor de poker con millones de usuarios, dado que tienes que hacer millones de mezclas conviene perder el menor tiempo posible.
Y confiar en el "azar" no suele ser muy buena práctica. Es una buena costumbre garantizar que el algoritmo termine en tiempo finito incluso en el peor caso posible, nos ayudará a evitarnos algunos errores "oscuros".
Como curiosidad de algoritmos basados en el azar, tenemos un algoritmo de ordenación que usa una técnica similar: El bogosort (o stupidsort). Que viene a ser el siguiente:
Dado un conjunto de números desordenados:
1º Comprobar que esten ordenados, si lo estan termina.
2º Mezclar los numeros aleatoriamente.
Y aquí una implementación de este algoritmo en C++:
#include <iostream>
#include <algorithm>
#include <ctime>
#include <iterator>
using namespace std;
void bogo_sort(vector<int>&);
int main()
{
vector<int> Numeros;
srand(time(NULL));
int N;
cout<<"Introduzca numero de elementos a ordenar: ";
cin>>N;
Numeros.resize(N);
for (int i = 0; i < 10;i++) // 10 intentos
{
generate(Numeros.begin(),Numeros.end(),rand); // relleno el vector de numeros aleatorios
// Muestra los numeros generados por pantalla:
// copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
time_t inicio = clock();
bogo_sort(Numeros);
time_t fin = clock();
cout<<(double)(fin-inicio)/(CLOCKS_PER_SEC)<<"s en ordenar "<<N<<" elementos"<<endl;
// muestra los numeros ordenados por pantalla
// copy(Numeros.begin(),Numeros.end(), ostream_iterator<int>(cout, " "));
// cout<<endl;
}
return 0;
}
bool enOrden(vector<int> &x) {return adjacent_find(x.begin(), x.end(), greater<int>()) == x.end();}
void bogo_sort(vector<int> &Numeros)
{
while (!enOrden(Numeros))
{
random_shuffle(Numeros.begin(),Numeros.end());
}
}
Dile que genere 10 elementos. A mí los tiempos me salen muy dispares (desde 0,063 hasta 5 segundos). Eso en rangos pequeños, cuanto mayor sea el rango, mayor será la dispersión.
En resumen, trabajar basado en la suerte nos da unos programas muy impredecibles y inestables. A mí personalmente no me gusta nada