[C con Clase] Numeros Aleatorios

Leonel Florín Sellés leonel06033 en cfg.jovenclub.cu
Mar Jun 24 14:31:45 CEST 2008


Bueno amigo:

Veo muchos ejemplos interesantes en las respuestas que te han dado,
pero no veo una explicación sustancial, que a lo mejor, necesaitas
una explicación completa, y bueno, sin ofender, me dispongo a darte.

Para general números aleatrorios en C, puedes utilizar la función
rand() que se encuentra en la biblioteca <stdlib.h> y un ejemplo
sería

a = rand ();

donde se genera un número aleatorio entre 0 y RAND_MAX, este ultimo
es una constante definida en el archivo de cabecera <stdlib.h>. este
valor máximo debería ser de por lo menos 32767, según ANSI, siendo
este un entero de 2 bytes.

Ahora, puede que nesecite generar números aleatorios dentro de un
rango numérico especifico y esto se puede arreglar, utilizando el
operador % junto con rand(), ejemplo

rando() % 7

esto producira números aleatorios desde 0 a 6, y a esta operación se
le llama dimensionar. y el número 7 se le llama factor de
dimensionamiento, pero queda que, si queremos que se produscan
números desde 1 a 6, entonces, estos que ya tenemos no nos sirven,
ya que van a ser números desde 0 a 6, por lo que podemos desplazar
el rango de valores, añadiendole la unidad, es decir

1 + (rand() % 7)

esto producira números desde 1 hasta 7 ya que desplace el rango, en
este ejemplo, primiero dimenciono y despues desplazo.

Pero esto tiene un problemita, si pruebas un programa con esto
varias veces, te daras cuenta de que se generan los mismos números
aleatorios, esto es una caracteristica de rand, y no es tan mala,
porque asi, podemos comprobar que las modificaciones hechas a un
programa fueron correctas, esto se usa en algunos casos.
Pero es que, la función rand() genera números seudoaleatorios, es
decir que no es aleatorio completamente, pero esto tiene arreglo,
existe una función dentro de la misma biblioteca llamada

srand()

srand() resibe un valor numéricos que es un entero unsigned, que
algunos llaman semilla, esto permite que cada vez que se llame a
rand() y srand() reciba un número diferente, entonces se produscan
valor aleatorios, siempre diferentes dentro del rango numérico
utilizado.

ahora, qué números podemos pasarle a srand(), bueno, cualquiera,
pero la mayoria de los programadores utilizan la función time del
sistema, que se enuentra en la biblioteca <time.h> y le pasan a
srand() la función time quedando

srand(time(NULL));

esto llama a la función time y esta defuelve la hora actual del
sistema en segundos y este valor es convertido a un entero unsigned,
aqui NULL se le pasa a time, porque time devuelve una cadena
representando la hora del dia, y NULL aqui desabilita esto, para
tomarlo como valor numérico.

ejemplo

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

main()
{
  int cara_da_dado;

  srand(time(NULL));

  cara_de_dado = 1 + (rand() % 6);
}

aquí, le di un valor a srand, para que se generen valor realmente
aleatorios, cada vez que se ejecute el programa, y cara de dado,
tomara un valor entre 1 y 6, es como si tiraramos un dado.

saludos, espero que esto te serva da algo.










Consejo Zaka ElabSi no entiendes escribeme...
> Puedes usar la función rand que está en stdlib.h (cstdlib).
>
> http://c.conclase.net/librerias/funcion.php?fun=rand
>
> Saludos.
>
> Zaka.
>
> Yasser Gonzalez Soto escribió:
>> Como hago para generar numeros aleatrios en C
>>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>


-- 

Datos Personales:
------------------------------------------------
    Provincia: Cienfuegos.
    Municipio: Cumanayagua
         Telé: 7496
Id. Jabber Jc: leonel06033 en jabber.cfg.jovenclub.cu
        Apodo: Erf
--------------------------------------------------
  "Sois lo que haceis de forma repetida. La excelencia no es un
hecho aislado, es un hábito".
                  Aristóteles.
--------------------------------------------------






Más información sobre la lista de distribución Cconclase