Mezclar arreglo en C

Mezclar arreglo en C (orden aleatorio)

En este post te muestro cómo mezclar un arreglo en C, es decir, aleatorizarlo o randomizarlo; como le llames. De este modo al final tendremos el arreglo mezclado, ordenado de forma aleatoria.

Para lograrlo simplemente necesitamos recorrer el arreglo y en cada iteración:

  1. Obtener un índice aleatorio que esté en el rango de 0 a longitud - 1
  2. Intercambiar el elemento en el índice del ciclo por el índice aleatorio

¡Vamos allá!

Mezclar arreglo en C

He explicado el funcionamiento arriba. Comenzamos definiendo la función que nos dará un número aleatorio y alimentando a srand.

La función queda así:

// maximo y minimo son inclusivos
int aleatorio_en_rango(int minimo, int maximo) {
    return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}

Alimentamos a srand:

srand(getpid());

Después definimos el arreglo y calculamos su longitud:

int arreglo[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int longitud =
        sizeof(arreglo) / sizeof arreglo[0];//https://parzibyte.me/blog/2018/09/21/longitud-de-un-arreglo-en-c/

Imprimimos el original para que la diferencia se note:

// Impresión
printf("Arreglo original:\n");
for (int i = 0; i < longitud; i++)printf("%d,", arreglo[i]);

Ahora sí viene la parte del algoritmo para hacer un arreglo aleatorio en C:

// Ciclo desde 0 hasta longitud de arreglo
for (int i = 0; i < longitud; i++) {
    int indiceAleatorio = aleatorio_en_rango(0, longitud - 1);
    // Intercambiar el actual con un elemento del índice aleatorio
    int temporal = arreglo[i];
    arreglo[i] = arreglo[indiceAleatorio];
    arreglo[indiceAleatorio] = temporal;
}

Obtenemos un índice aleatorio en la línea 3. Después, el valor en el índice i es respaldado temporalmente en temporal. Luego, al elemento que está en i le ponemos lo que hay en el índice aleatorio y al índice aleatorio le ponemos el temporal.

Poniendo todo junto

Mezclar arreglo en C
Mezclar arreglo en C

Al final de todo, imprimimos el arreglo que ya estará ordenado de forma aleatoria. El código completo queda así:

/**
 * Mezclar arreglo en C, es decir, hacer aleatorio, sacudir, randomizar
 * @date 2019-12-18
 * @author parzibyte
 * @see https://parzibyte.me/blog
 * */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// maximo y minimo son inclusivos
int aleatorio_en_rango(int minimo, int maximo) {
    return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}

int main(void) {
    // Como queremos aleatorios, alimentamos a srand
    // https://parzibyte.me/blog/2019/03/21/obtener-numeros-aleatorios-c/
    srand(getpid());
    int arreglo[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int longitud =
            sizeof(arreglo) / sizeof arreglo[0];//https://parzibyte.me/blog/2018/09/21/longitud-de-un-arreglo-en-c/
    // Impresión
    printf("Arreglo original:\n");
    for (int i = 0; i < longitud; i++)printf("%d,", arreglo[i]);
    // Ciclo desde 0 hasta longitud de arreglo
    for (int i = 0; i < longitud; i++) {
        int indiceAleatorio = aleatorio_en_rango(0, longitud - 1);
        // Intercambiar el actual con un elemento del índice aleatorio
        int temporal = arreglo[i];
        arreglo[i] = arreglo[indiceAleatorio];
        arreglo[indiceAleatorio] = temporal;
    }
    printf("\nArreglo mezclado:\n");
    for (int i = 0; i < longitud; i++)printf("%d,", arreglo[i]);
    return 0;
}

¿Más ejercicios sobre C? click aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *