目次
1. Generación de números aleatorios en C: la función rand
1.1 ¿Qué es la función rand?
rand()
es una función de C utilizada para generar números pseudoaleatorios. Los números pseudoaleatorios son secuencias generadas mediante un algoritmo predefinido; no son verdaderamente aleatorios, pero son suficientes para la mayoría de los usos. rand()
devuelve un número entero entre 0 y 32767 . Este rango puede variar según el sistema, pero normalmente se mantiene en ese valor.1.2 Uso básico de la función rand
Para usarrand()
, es necesario incluir stdlib.h
. El siguiente código muestra un ejemplo básico de cómo generar un número aleatorio con rand()
:#include <stdio.h>
#include <stdlib.h>
int main(void) {
int randomNumber = rand();
printf("Generated random number: %d
", randomNumber);
return 0;
}
Al ejecutar este código, se muestra un número aleatorio entre 0 y 32767. Sin embargo, el inconveniente es que siempre genera la misma secuencia de números aleatorios en cada ejecución. Esto se explicará más adelante.
2. Cómo ajustar el rango de los números aleatorios
2.1 Limitar el rango con el operador módulo
En muchos casos, se necesita un número aleatorio dentro de un rango específico. Por ejemplo, si se desea un número aleatorio entre 1 y 100, se puede usar el operador módulo%
sobre el resultado de rand()
:int numberInRange = rand() % 100 + 1; // Genera un número entre 1 y 100
En este caso, se toma el resto de dividir el resultado de rand()
entre 100 y se suma 1, generando así un número entre 1 y 100. Con este método se pueden generar fácilmente números dentro de cualquier rango .2.2 Función para generar un número aleatorio dentro de un rango
Para mayor flexibilidad, se puede crear una función que reciba los valores mínimos y máximos:int getRandomNumber(int min, int max) {
return rand() % (max - min + 1) + min;
}
Con esta función, es posible generar un número en cualquier rango, por ejemplo getRandomNumber(1, 100)
.3. Cambiar el patrón de los números aleatorios con srand
3.1 ¿Qué es la función srand?
Si se utilizarand()
directamente, cada ejecución del programa produce la misma secuencia de números. Esto es característico de los números pseudoaleatorios: útil para depuración, pero no adecuado cuando se requieren resultados realmente variables. Para solucionar esto se usa srand()
, que establece la semilla del generador y cambia el patrón de los números generados .3.2 Cómo usar srand
srand()
debe llamarse antes de rand()
para establecer la semilla. Normalmente se utiliza la hora actual como semilla:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // Establecer la semilla con la hora actual
int randomNumber = rand();
printf("Generated random number: %d
", randomNumber);
return 0;
}
Con este código, cada ejecución producirá un patrón distinto. time(NULL)
devuelve la hora en segundos, lo que garantiza una semilla diferente en cada ejecución.
4. Ejemplos de uso de números aleatorios
4.1 Uso en juegos
Los números aleatorios son comunes en el desarrollo de videojuegos: para definir posiciones aleatorias de personajes, calcular la probabilidad de aparición de ítems, etc. El siguiente ejemplo simula una tirada de dado:#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand((unsigned int)time(NULL)); // Establecer la semilla
int diceRoll = rand() % 6 + 1; // Generar un número entre 1 y 6
printf("Dice roll: %d
", diceRoll);
return 0;
}
Este programa genera un número entre 1 y 6 como resultado de un dado. Así se introducen elementos impredecibles en un juego.4.2 Método de Monte Carlo
Los números aleatorios también se aplican en simulaciones como el método de Monte Carlo, que aproxima soluciones de problemas complejos. Por ejemplo, se puede aproximar el valor de π con números aleatorios :#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int n_trials = 1000000;
int n_inside = 0;
double x, y, pi;
srand((unsigned int)time(NULL));
for (int i = 0; i < n_trials; i++) {
x = (double)rand() / RAND_MAX;
y = (double)rand() / RAND_MAX;
if (x * x + y * y <= 1) {
n_inside++;
}
}
pi = 4.0 * n_inside / n_trials;
printf("Approximated π: %f
", pi);
return 0;
}
Este programa usa puntos aleatorios para aproximar π mediante el método de Monte Carlo, generando valores entre 0 y 1 con rand()
.
5. Consideraciones sobre rand y srand
5.1 Comprender los números pseudoaleatorios
Los números generados porrand()
no son verdaderamente aleatorios, sino pseudoaleatorios calculados a partir de un algoritmo interno. Usando la misma semilla, siempre se obtiene la misma secuencia. Esto es útil en depuración, pero no adecuado cuando se requiere verdadera aleatoriedad.5.2 Errores comunes
Los errores más frecuentes al usar números aleatorios son no utilizarsrand()
o malinterpretar el rango que devuelve rand()
. Si no se establece la semilla, siempre se obtiene la misma secuencia. Además, al usar rand() % n
, el valor de n
puede generar distribuciones no uniformes si no se usa correctamente.Conclusión
La generación de números aleatorios en C es ampliamente utilizada en áreas como juegos y simulaciones. Comprender el uso derand()
y srand()
permite añadir imprevisibilidad a los programas. Usa esta guía como referencia para implementar tus propios programas con números aleatorios.