C: Generando números aleatorios (random).
Generar números aleatorios es algo que se requiere en muchos programas y con
diversos objetivos. Al simular el lanzamiento de un dado, una moneda, repartir cartas o
simplemente mostrar números al azar dentro de un intervalo, requerimos de ellos. A
continuación veremos cómo lograr generar estos números random en C.
Aclaración inicial: Los números que obtendremos en realidad son pseudoaleatorios,
ya que no son netamente aleatorios sino el resultado de ciertos cálculos especificados
en el algoritmo de las funciones que usaremos. Pero esta simulación de números
random que obtendremos nos servirá de igual manera a fines prácticos.
La función rand( ):
Esta función se encuentra en la librería stdlib.h y lo que hace es devolvernos un
número entero aleatorio en un rango que va desde 0 hasta una constante
llamada RAND_MAX que está definido como 0x7FFF (si lo quisiéramos mostrar en
C como un int sería al menos 32767, en caso de mostrarlo como un long long tendría
cerca de 17 cifras... en resumen es un número grande).
Pero normalmente nosotros queremos que el número que nos genere la función se
encuentre dentro de un determinado rango y que seguramente será mucho menor.
Veamos algunas formas de obtener este resultado.
Números aleatorios entre 0 y n:
Si queremos obtener un random entre 0 y n, podríamos hacerlo de la siguiente
manera:
Donde si n fuera 10 tendríamos lo siguiente:
Como vemos en la misma imagen, se hace de la misma manera para cualquier número
entre 0 y n.
Números aleatorios entre m y n:
En otras ocasiones, puede que queramos generar un random en un intervalo que no
comience en 0. Para estos casos la regla general sería la siguiente, donde m sería el
límite inferior del intervalo y n el superior.
En este caso si quisiéramos que el número generado estuviera, por ejemplo, entre 50 y
100, tendríamos algo así:
Todo muy lindo, pero si ejecutamos el programa varias veces veremos que siempre
nos genera el mismo número aunque nos cansemos de ejecutarlo ... ¿y qué hacemos?...
no se preocupen que ahora mostraremos la forma de solucionar eso.
Función srand( ):
Como vimos, rand llega siempre al mismo resultado si lo usamos tal como lo
explicamos. Esto sucede porque la función lo que hace es realizar cálculos
comenzando en lo que llamamos semilla (un número inicial), por lo que al llegar al
mismo punto tendremos el mismo resultado si no se modifica esta semilla.
Para modificarla tenemos la función srand, a la que le pasaremos como argumento un
número que se convertirá en la famosa semilla que nos sacará de líos.
Pero... si colocamos un número fijo (o incluso uno generado con rand) como semilla
estaremos en la misma que al comienzo ya que siempre empezará desde el mismo
punto y los cálculos devolverán el mismo resultado.
Si quieren comprobarlo por ustedes mismos, pueden probar lo que acabo de decir con
algo así:
Usando el número fijo 1 como semilla obtendremos siempre el mismo resultado. Si
colocaríamos esto dentro de un bucle for e imprimiéramos en pantalla el resultado
veríamos esto:
Todas las veces nos genera el mismo número tal y como lo anticipamos. Pero no todo
está perdido, lo que haremos para lograr que genere distintos números aleatorios cada
vez será pasarle a srand la hora como argumento, y como la hora del sistema está en
constante cambio ¡la semilla irá cambiando! y lograremos lo que buscamos.
Para hacer esto, debemos incluir la librería time.h y usaremos su función time( ) como
argumento de srand.
Con lo que en nuestro ejemplo tendríamos:
Y si ejecutamos varias veces el programa veremos que ahora sí van cambiando los
números generados.