0

La explicación que viene en cplusplus es dificil para mi entendimiento y no logro comprender del todo como funciona esta función(random_shuffle). ¿Como mostrar el array barajado? ¿Algún fallo que recalcar?

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<algorithm>

using namespace std;

int const MAX=10;

typedef int tArray[MAX];

int random (int i) { return rand()%i;}

int main()
{
    srand(time(NULL));
    tArray miarray;
    for(int i=0; i<MAX; i++)
    {
        miarray[i]=i;
    }

    random_shuffle(miarray.begin(),miarray.end());
    random_shuffle(miarray.begin(),miarray.end(),random);

    cout << "La secuencia aleatoria es:";

    for()//mostrar los datos barajados
    {
        cout << endl;
    }
}
UsuarioRandom
  • 734
  • 10
  • 22

2 Answers2

4

¿Como mostrar el array barajado?

Pues muy fácil:

for (const auto &valor : miarray) // Mostrar los datos barajados.
{
    std::cout << v << '\n';
}

¿Algún fallo que recalcar?

  1. std::random_shuffle ha sido marcada como deprecada a partir de C++14. Esta decisión se ha tomado porque la versión de std::random_shuffle que usa iteradores tiene una dependencia directa con std::rand que se está dicutiendo deprecarlo también, la función std::rand debe ser substituida por las funciones de la cabecera <random> ya que std::rand se considera dañino.
  2. miarray.begin() y miarray.end() no compila. miarray es un alias de una formación de enteros (int) y como tal, no tiene funciones miembro.
  3. A main le falta el retorno.
  4. No se aconseja el uso de using namespace std.
  5. En C++ se aconseja que las definiciones (variables y símbolos) tengan el ámbito más pequeño posible, deberías mover el alias y la constante de tamaño al interior de main.
  6. Usar el operador de módulo (%) junto con std::rand para seleccionar números aleatorios es impreciso.

Con las correcciones indicadas tu código podría quedar así:

#include <iostream>
#include <algorithm>
#include <random>

int main()
{
    constexpr int MAX = 10;
    using tArray = int[MAX];
    tArray miarray{};

    std::generate(std::begin(miarray), std::end(miarray), [i = 0]() mutable { return i++; });

    std::random_device dispositivo;
    std::mt19937 generador(dispositivo());

    std::shuffle(std::begin(miarray), std::end(miarray), generador); 

    for (const auto &v : miarray)
    {
        std::cout << valor << '\n';
    }

    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Antes de nada, muchas gracias por responder de forma tan profesional. No obstante, esta algo lejos de mi entendimiento. Quedan claro los puntos 3,4,5,6. Respecto a la 1, tenemos que random_shuffle es impreciso y necesita de srand pero eso implica mas lineas de código que utilizan shuffle y al no entenderlo bien, hace que se me complique mas. – UsuarioRandom Feb 24 '18 at 23:34
  • Y por alguna razón que no entiendo, no logro que compile tu programa. – UsuarioRandom Feb 24 '18 at 23:38
  • @Vendetta del punto 2 no mencionas nada, y es también importante. Si tienes dudas adicionales (y además ya has dado por resuelta esta pregunta) te animo a crear una pregunta adiciona sobre las dudas que te surjan. Respecto a que no compile el programa que puse de ejemplo, posiblemente tenga que ver con tu versión del compilador (pero no puedo adivinarlo sin ver los errores). Echa un vistazo a [este enlace](https://wandbox.org/permlink/yzh36emxe9UhigXu) que contiene una versión del programa funcionando. – PaperBirdMaster Feb 26 '18 at 07:58
0

Pongo acá una versión donde trato de usar tu mismo código, lo más fielmente que puedo, pero con un estilo C++ actual. Fíjate en los comentarios y si tienes dudas que no puedes resolver con tu libro (porque necesitas un buen libro para empezar, ¿verdad?) puedes poner preguntas específicas para cada duda (me refiero a las dudas que no puedas resolver por tí mismo después de algún par de horas de estudio responsable, ¿verdad?)

#include<iostream>
#include<ctime>
#include <random> // para default_random_engine()
                  // Generador de números pseudoaleatorios de baja calidad;
                  // probablemente el compilador use rand() internamente

using namespace std; // no es lo más aceptado, pero se usa mucho en ejemplos didácticos

int const MAX = 10;  // no se usan mayúsculas, y en particular "MAX" es un nombre peligroso

typedef int tArray[MAX]; // mejor que "typedef" es "using"


int main()
{

    tArray miarray;
    for (int i = 0; i<MAX; i++)
    {
        miarray[i] = i;
    }

    int seed = static_cast<int>(time(NULL)); // (no uses cast de estilo C)

    shuffle(begin(miarray), end(miarray), std::default_random_engine(seed)); 

    cout << "La secuencia aleatoria es: ";

    for (const auto& i : miarray) { // "range based for loop" se usa muuuucho, acostúmbrate
        cout << i << ' ';
    }
    cout << '\n'; // no uses endl a menos que sea _realmente_ necesario.

    return 0; // no es obligatorio, pero su ausencia puede poner nervioso a algún compañerito de banco.
}