rompiendome la cabeza con rand()

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

rompiendome la cabeza con rand()

Notapor link182 » Mar Ene 09, 2007 4:24 am

holas, soy nuevo en el foro y en c++ :P quiero aprender a manejarlo con sdl, pero estoy comenzando y no entiendo bien esto del rand()...

tengo este for
Código: Seleccionar todo
for (a = 0; a < 10; a++)
{
    num = rand() % 100;
    cout << num << endl;
}

y cada que lo ejecuto salen 10 numeros diferentes entre si, pero son los mismos en cada ejecución... según el libro que estoy leyendo, debo usar algo como
Código: Seleccionar todo
srand( time( NULL ));
antes de usar el rand()... pero si lo uso dentro del for:
Código: Seleccionar todo
for (a = 0; a < 10; a++)
{
    srand( time( NULL ));
    num = rand() % 100;
    cout << num << endl;
}

pues me sale el mismo numero en las 10 pasadas :S
y como que esta raro, me funciona como debería si pongo lo del srand antes del for pero no termino de entender, si ahí se ejecuta una sola vez comparado con lo que pongo ahí arriba que se ejecuta cada pasada (que supuse debería ser mucho más random) :P podrian explicarme el por que de eso? :P
link182
 
Mensajes: 1
Registrado: Sab Ene 06, 2007 8:23 am

Re: rompiendome la cabeza con rand()

Notapor hugoruscitti » Jue Ene 11, 2007 3:25 am

link182 escribió:y cada que lo ejecuto salen 10 numeros diferentes entre si, pero son los mismos en cada ejecución... según el libro que estoy leyendo, debo usar algo como
Código: Seleccionar todo
srand( time( NULL ));

Claro, la función srand inicializa el generador de números aleatorios mediante
un argumento como semilla. Se suele utilizar el retorno de otra función como
"time(NULL)" para que esta semilla sea diferente en cada ejecución del
programa.

Lo que deberías utilizar es una sentencia como la siguiente pero solo al
principio del programa:

Código: Seleccionar todo
srand(time(NULL));

Con ello los números serán "menos predecibles".

y como que esta raro, me funciona como debería si pongo lo del srand antes del for pero no termino de entender, si ahí se ejecuta una sola vez comparado con lo que pongo ahí arriba que se ejecuta cada pasada (que supuse debería ser mucho más random) :P podrian explicarme el por que de eso? :P

¿y llamando a srand(rand())?. No se, es una idea, puede que alterando la
semilla mejore la variedad de resultados.

La página del manual de GNU indica algo interesante sobre esta función,
sobretodo al final de la misma, donde no recomiendan utilizar el operador %
para acotar el resultado de rand:

http://www.hispafuentes.com/hf-doc/man/man3/rand.3.html

Buena suerte.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: rompiendome la cabeza con rand()

Notapor Geo » Dom Ene 14, 2007 12:13 am

link182 escribió:pero si lo uso dentro del for:
Código: Seleccionar todo
for (a = 0; a < 10; a++)
{
    srand( time( NULL ));
    num = rand() % 100;
    cout << num << endl;
}

pues me sale el mismo numero en las 10 pasadas :S
y como que esta raro, me funciona como debería si pongo lo del srand antes del for pero no termino de entender,

Por supuesto, puesto que estás "inicializando la semilla" siempre al mismo valor. time( NULL ) te devuelve lo mismo en todas las pasadas, por lo tanto siempre pasas el mismo valor a srand(), con lo que siempre tendrás el mismo número en la primer llamada a rand() después de haber usado srand().

Saludos,
JJ (Geo).
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron