Anuncios

Bienvenidos sean a este post, hoy nos desviaremos un poco de los posts anteriores.

Anuncios

Hasta ahora hemos visto como son algunas estructuras complejass pero hoy nos desviaremos un poco para ver un tema que lo vincularemos con los anteriores, pero primero veamos que es una computadora:

Una computadora es una maquina determinista

el tinchicus
Anuncios
Anuncios

Esto quiere decir que las computadores cada vez que ejecutan un programa siempre devolvera el mismo resultado sin variacion, esto es fundamental para el calculo ordenado pero en algunas circunstancias debemos simular la ocurrencia aleatoria de algunos eventos, aqui entra la relacion con lo visto hasta el post anterior porque un juego de cartas donde sabemos cuales son las cartas que recibiremos no tiene mucha gracia, aqui entra la mezla de la baraja para que cada jugador reciba un juego distinto de cartas, y por otro lado la aleatorriedad es algo inherente en nuestras vidas, ya que esto afecta desde el clima hasta nuestras huellas digitales.

Anuncios

Pero como podemos obtener aleatoriedad de una maquina determinista no aleatoria? Bueno tenemos dos formas:

  • La primera es via hardware, la mejor opcion es por estatica generada a traves de un chip de sonido defectuoso a proposito
  • La segunda es a traves de un generador de numeros pseudoaleatorios (PRNG)
Anuncios
Anuncios

Como podran ver la primera opcion no solo es poco practica sino que es dificil de encontrar disponible por lo tanto usualmente nos decantaremos mas por la segunda opcion, este es un algoritmo que genera una secuencia muy larga de numeros, a esta se la denomina periodo o la periodicidad del PRNG, esta va a ser la longitud de la secuencia de numeros que puede generar antes de repetir la secuencia,cuanto mayor sea mejor sera, aunque en realidad cada vez que le solicitemos un numero a PRNG nos devolvera el siguiente numero de la secuencia, pero nosotros disponemos de un elemento asociado a la periodicidad llamado semilla que no es mas que un punto de partida en la secuencia de nuestros numeros, una semilla es un tipo de numero variable que no neceesariamente tiene que ser aleatorio, ya que puede ser los segundos pasados desde 1970, los microsegundos del segundo actual o la posicion de una cabeza sobre un plato del disco duro, y sino cambiaramos la semilla siempre obtendremos la misma secuencia de numeros.

Anuncios
Anuncios

Con todo esto comentado podemos decir que para generar numeros al azar a traves de PRNG debemos realizar dos operaciones, la primera sera iniciarlo por medio de una semilla, y la segunda operacion sera hacer repetidas llamadas para obtener numeros de la lista de forma aleatoria, si bien cualquier computadora provee un PRNG y esta disponible para un programador pero esto no quita que es algo que se sigue estudiando debido a su importancia en los eventos de la vida real, pero recuerden que los PRNG no son todos iguales donde varian su periodicidad y su «aleatoriedad» de un llamado al otro, el valor que devuelve PRNG puede ser un valor entre 0 y un valor maximo o bien puede ser un valor de coma flotante entre 0,0 y 1,0 pero a este tipo lo podemos normalizar a nuestra necesidad.

Anuncios

Si bien no siempre es necesario una aleatoridad tan compleja y con una simple podemos solucionar todos nuestros problemas, en nuestro caso usaremos el simple que nos provee la libreria estandar de C, vamos a hacer un ejemplo simple para entenderlo y para ello crearemos un nuevo archivo llamado ejemplo25.c y le agregaremos el siguiente codigo:

ejemplo25.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int i, n = 5;
	time_t t;

	srand((unsigned) time(&t));

	for(i=0; i < n; i++)
	{
		printf("%d\n", rand() % 50);
	}

	return 0;
}
Anuncios
Anuncios

Este es un ejemplo simple donde veremos unas cuantas cosas nuevas, primero agregaremos una nueva libreria llamada stdlib.h la cual es la libreria estandar de C y las que nos permite utilizar las herramientas para acceder a los numeros aleatorios, la otra libreria es la que nos permite acceder a funciones para controlar el tiempo, pasando al main primero tenemos dos declaraciones de variables, en una seran dos de tipo int para usarlas un poco mas adelante, en una solo la declaramos y en la otra establecemos un valor, la otra variable sera una de tipo time_t en la cual guardaremos todos los segundos transcurridos en tiempo UNIX, la siguiente linea es la importante porque es la que planta la semilla para nuestro generador de numeros aleatorios, y para ello le pasaremos la direccion de memoria de nuestra variable con los segundos de tiempo UNIX, lo siguiente es un bucle for donde mostraremos el resultado de llamar a rand, con este operador y el valor informado siempre generara un numero al azar en el rango de 0 a 49, si necesitan cambiarlo modiffiquen dicho valor, con esto comentado compilemos y veamos como es su salida mediante el siguiente video

Anuncios

Como pueden ver funciono perfectamente, lo unico que debemos tener en cuenta principalmente para generar nuestros numeros aleatorios es primero utilizar a srand para establecer a nuestra semilla y despues por medio de rand iremos obteniendo los valores que necesitemos, este que vimos es uno de varios disponibles pero este es de los mas practicos y simples para utilizar.

Anuncios

En resuem, hoy hemos visto numeros aleatorios o random, un poco de teoria, como es en realidad, como podemos generarlo, como podemos obtenerlo y despues un ejemplo simple para poder verlo en accion, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50