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:
- Obtener un índice aleatorio que esté en el rango de
0
alongitud - 1
- 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
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í.