24 agosto 2011

Números aleatorios en C++

numeros-300x290Los números aleatorios son de gran importancia en la programación.  Necesitas números aleatorios para hacer girar unos dados, repartir cartas, posicionar enemigos en la pantalla y tal vez hasta controlar sus movimientos.  Sin embargo, crear un algoritmo para generar números aleatorios es todo un problema porque, ¿quién sabe cómo le hace para pensar en un número al azar?  ¿Acaso sigue algunos pasos?  No, es un proceso mental fácil de realizar, pero que no lleva algún procedimiento preciso y esto hace que sea casi imposible hacerlo en la computadora.  Lo más cercano es una función matemática que calcula números al azar.  Aquí voy a presentar un ejemplo que puede ser útil para generar números aleatorios usando funciones de C++.

Antes de empezar de lleno, honor a quien honor merece.  Este ejemplo y parte de la explicación es una traducción/adaptación de un artículo que leí en la página de daniweb.com, escrito por un tal Bob (¿acaso será el constructor?  Bueno, mal chiste…).  Voy a ir explicando funciones, constantes y una que otra monería y al final viene un programa que ejemplifica su uso.

La funciones que se necesitan para generar números al azar se encuentran en la librería cstdlib, así que hay que incluirlo al principio del código.  Para generar el número aleatorio se hace uso de la función rand, misma que genera un número al azar entre 0 y la constante RAND_MAX (que vale generalmente 32,767 pero puede variar según el compilador de C++ que estés usando).

rand funciona de maravilla, pero el problema es que cada vez que ejecutes el programa, te va a mostrar exactamente la misma secuencia de números, lo cual puede resultar interesante la primera vez, pero pierde chiste en las ejecuciones subsecuentes del programa.  Para remediar esto, se puede inicializar el generador de números aleatorios con la función srand, misma que recibe un número entero que inicia el pseudogenerador de números aleatorios.  Pero si cada vez lo inicializas con el mismo entero, el problema no se quita: sigues generando la misma serie de números.  Lo mejor es usar el reloj del sistema para que te dé la hora actual, lo conviertes a entero y así cada vez es diferente.  Para eso usamos la función time que está en la librería ctime.

Una vez resuelto el problema de generar una secuencia de números aleatorios únicos, ahora hay que abordar la manera de generar números en un cierto rango.  La fórmula para hacerlo sería la siguiente:

numero_aleatorio=rango_inferior+int(rango*rand()/(RAND_MAX+1.0))

donde rango_inferior es el valor mínimo del rango del que se desea un número y rango es la diferencia entre el valor mayor y el menor.  Por ejemplo, si quiero generar un número aleatorio entre 6 y 15 y guardarlo en un entero que declaré con el nombre de X, la instrucción sería:

X=6+int((15-6)*rand()/(RAND_MAX+1.0))

Creo que con esta explicación ya puedes generar los números aleatorios que necesites para cualquier aplicación.  Aquí les dejo el código fuente de un programa que ejemplifica todo lo anterior.  ¡Hasta la próxima!

(Imagen de los números aleatorios cortesía del blog “La aventura de las matemáticas”)

aleatorio.cpp

1 comentario:

Anónimo dijo...

exelente explicacion!!

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...