En este post voy a mostrar cómo podemos generar números aleatorios o al azar con C. Eso sí, no serán para criptografía, simplemente serán pseudoaleatorios.
En resumen, sí van a darte números aleatorios pero no los vayas a usar para cosas que tengan que ver con la seguridad.
Veremos cómo obtener un número aleatorio, poner una semilla a rand y también obtener un número al azar dentro de un rango.
Si vas a usar time, incluye a time.h
. Para usar a rand
incluye stdlib.h
y para llamar a getpid
incluye a unistd.h
.
Para obtener números aleatorios distintos a través de la ejecución del programa, debemos ponerle una semilla a rand.
Esto se logra con srand
, y es importante mencionar que debemos llamar a srand exactamente una vez en todo nuestro programa, ni más ni menos.
El valor que le pasamos a srand debe ser un valor no fijo, así que se recomienda llamar a time
o a getpid
; en este caso lo haré con getpid
porque tuve problemas con time
:
// Hay que alimentar a rand, solamente una vez
srand(getpid());
// De manera alternativa puedes hacer esto:
srand(time(NULL));
getpid
obtiene el id del proceso del programa, el cual cambiará siempre. Y time
obtiene la hora de ejecución del programa (eso en términos generales).
Repito de nuevo, llama a srand
solamente una vez, sin importar si le pasas lo que devuelve time
o getpid
.
Ahora sí a lo que venimos. Una vez que ya llamamos a srand
, podemos llamar a rand
. Este devolverá un número aleatorio, sin importar cuántas veces lo llamemos. Veamos un ejemplo:
#include <stdio.h> // printf
#include <stdlib.h> // rand
#include <unistd.h> // getpid
// Función main
int main(){
// Hay que alimentar a rand, solamente una vez (seed rand)
srand(getpid());
// Ahora ya podemos llamar a la función
printf("Tengo un aleatorio: %d\n", rand());
printf("Tengo un aleatorio: %d\n", rand());
printf("Tengo un aleatorio: %d\n", rand());
printf("Tengo un aleatorio: %d\n", rand());
printf("Tengo un aleatorio: %d\n", rand());
printf("Tengo un aleatorio: %d\n", rand());
}
El ejemplo va a imprimir números aleatorios que van desde 0 hasta RAND_MAX, el cual es un número que cambia dependiendo de la implementación pero para asegurarnos siempre podemos imprimirlo:
printf("RAND_MAX es: %d\n", RAND_MAX);
En este caso me da 2147483647.
Ya vimos cómo obtener números aleatorios, ahora veamos cómo obtener números aleatorios detro de un rango. Por ejemplo, obtener un número aleatorio entre 1 y 10.
Para ello usamos las matemáticas y creamos una función. Recuerda que antes de llamar a la función debes llamar a srand
. No olvides esa parte nunca.
// Devuelve un número aleatorio entre minimo y maximo, incluyendo a minimo y maximo
int aleatorio_en_rango(int minimo, int maximo){
return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}
De esa manera declaramos una función que devuelve un número al azar en un rango. Observa que el mismo mínimo o máximo puede ser devuelto; es decir, se incluyen los límites.
Para demostrar el uso de esta función tenemos este programa que genera números en un rango:
#include <stdio.h> // printf
#include <stdlib.h> // rand y RAND_MAX
#include <unistd.h> // getpid
// Prototipo de funciones
int aleatorio_en_rango(int minimo, int maximo);
// Función main
int main(){
// Hay que alimentar a rand, solamente una vez (seed rand)
srand(getpid());
// Ahora ya podemos llamar a la función
printf("Entre 2, 50 encontramos a %d\n", aleatorio_en_rango(2, 50));
printf("Entre 1, 53 encontramos a %d\n", aleatorio_en_rango(1, 53));
printf("Entre 52, 800 encontramos a %d\n", aleatorio_en_rango(52, 800));
printf("Entre 1, 3 encontramos a %d\n", aleatorio_en_rango(1, 3));
}
// Definir función cuyo prototipo está al inicio
// Devuelve un número aleatorio entre minimo y maximo, incluyendo a minimo y maximo
int aleatorio_en_rango(int minimo, int maximo){
return minimo + rand() / (RAND_MAX / (maximo - minimo + 1) + 1);
}
La salida es la siguiente:
Recuerda que tú también puedes probar y compilar el código por ti mismo, mira este post para instalar el compilador de C.
Así de simple podemos obtener números aleatorios con C. Más tarde podemos hacer pequeños juegos usando rand; por ejemplo, un juego de dados o uno en donde adivines el número.
Aprende más sobre C en mi blog.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.
Ver comentarios