Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Anastacio en 16 Febrero 2012, 20:35 pm



Título: Srand para que den dos numeros diferentes?
Publicado por: Anastacio en 16 Febrero 2012, 20:35 pm
En un programa que estoy haciendo, necesito que se generen dos numeros aleatorios (Lo estoy haciendo con srand,), y uso time, para que me generen semillas diferentes unas de otras. El problema es que se generan dos en el mismo milisegundo, y siempre son exactamente iguales,  uno del otro, ej: 9 9, 4 4, asi, sucesivamente. Como podria hacer?

Nota: Ya busque en google, en la guia del Dev C ++, en los ejemplos de los programas por internet y por Dev C ++.

Gracias de antemano.


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: armizh en 16 Febrero 2012, 20:49 pm
Podrias probar a realizar un srand, luego hacer un sleep, usleep, o delay o lo que tengas a mano (si usas algun sistema POSIX tienes usleep(), en Windows tienes Sleep() ) para esperar un segundo y realizar otro srand, ya que si usas time como semilla estarias tomando la misma semilla habiendo mas posibilidades de que salga el mismo resultado.
Tambien puedes probar con utilizar time como semilla, pero relizando alguna operacion con time, p.ej. time*2, time+2, la cosa es que no vaya la misma semilla en el mismo milisegundo.

Saludos.


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Akai en 16 Febrero 2012, 22:12 pm
mira la referencia de srand:

http://cplusplus.com/reference/clibrary/cstdlib/srand/

El procedimiento es:

1)Usa el tiempo actual como semilla
2) saca el número
3) cambia la semilla, vuelva al paso 2.


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: rir3760 en 17 Febrero 2012, 01:22 am
En un programa que estoy haciendo, necesito que se generen dos numeros aleatorios (Lo estoy haciendo con srand,), y uso time, para que me generen semillas diferentes unas de otras.

...

Nota: Ya busque en google, en la guia del Dev C ++, en los ejemplos de los programas por internet y por Dev C ++.
Por lo visto no buscaste en estos foros ya que hay temas relacionados con la operación que mencionas, uno de ellos es Ayuda en codigo que genera aleatorio (http://foro.elhacker.net/programacion_cc/ayuda_en_codigo_que_genera_aleatorio-t349682.0.html).

Y casi puedo asegurar que tu error es colocar la llamada a srand justo antes de la llamada a rand: esa es la única explicación para obtener dos veces el mismo numero con llamadas consecutivas a función.

Un saludo


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Anastacio en 17 Febrero 2012, 13:43 pm
Acabo de mirar algo, y parece que en esos momentos, si tu pones rand para imprimir, como si fuese una variable, te da el valor del numero aleatorio calculado por el Srand.
Entonces, tambien podria poner un wait(1), para que espere un segundo. El sleep y el wait han de ser parecidos, no?


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: rir3760 en 17 Febrero 2012, 17:09 pm
si tu pones rand para imprimir, como si fuese una variable, te da el valor del numero aleatorio calculado por el Srand.
No. "srand" solo define la semilla, el siguiente valor de la serie es calculado y retornado por la función "rand".

Va de nuevo el consejo: un buen libro y adiós a la mayoría de los problemas.

Entonces, tambien podria poner un wait(1), para que espere un segundo. El sleep y el wait han de ser parecidos, no?
No tienes porque utilizar pausas entre llamadas a "rand", si se requiere es por algún error en el programa y mientras no publiques su código fuente sera difícil (sino imposible) ayudarte.

Un saludo


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Eternal Idol en 17 Febrero 2012, 17:42 pm
Me sumo a rir3760:

CONSEGUITE UN LIBRO "Anastacio".


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Anastacio en 19 Febrero 2012, 17:10 pm
Ya he conseguido uno, y he estado leyendo largo rato. Aunque las explicaciones son poco sastifactorias (aun estoy intentando entender el tema de getchar y putchar), tal vez me ayude.

Si, srand define la semilla, y yo uso el horario para crear la semilla (con time). Entonces, al darle un segundo de intervalo entre la generacion de una semilla y la otra, te da un numero diferente. Estuve tratando con sleep y wait, pero como no se como se usan bien, probe con un getchar para hacer una pausa, y funciona perfecto, genera numeros distintos unos de otros.



Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Eternal Idol en 19 Febrero 2012, 17:24 pm
Ya he conseguido uno, y he estado leyendo largo rato. Aunque las explicaciones son poco sastifactorias (aun estoy intentando entender el tema de getchar y putchar), tal vez me ayude.

¿Te resulta muy dificil llamar a un par de funciones? Tal vez debas reconsiderar el asunto y dedicarte a otra cosa mas sencilla.

Si, srand define la semilla, y yo uso el horario para crear la semilla (con time). Entonces, al darle un segundo de intervalo entre la generacion de una semilla y la otra, te da un numero diferente. Estuve tratando con sleep y wait, pero como no se como se usan bien, probe con un getchar para hacer una pausa, y funciona perfecto, genera numeros distintos unos de otros.

¿No leiste lo que te dijo rir3760? No hace falta ninguna pausa.


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Anastacio en 19 Febrero 2012, 19:41 pm
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

int main()
{
    int num1;
    int num2;
    int c;
    int resultadojugador;
    int resultado;
    int repetidor;
    int vida;
    int nivel;
    int contador;
    num1 = 0;
    num2 = 0;
    repetidor = 0;
    resultadojugador = 0;
    contador = 0;
    nivel = 0;
    vida = 5;
    resultado = 0;
    c = 0;
    system("color F1");
    printf("Este programa prueba su Habilidad con las matematicas.\n");
    printf("Elija un nivel\n");
    printf("1.Facil\n");
    printf("2.Medio\n");
    printf("3.Dificil\n");
    scanf("%d",&c);
   do{
    if(c == 1)
    {
    nivel = 10;
 
    }
    if(c == 2)
{
    nivel = 50;
   
    }
    if(c == 3)
    {
    nivel = 100;
    }
   
    do{     
    srand( (unsigned)time( NULL ) );
    num1 = rand() % nivel;
    getchar();
    srand( (unsigned)time( NULL ) );
    num2 = rand() % nivel;
    getchar();
    printf("\nEl primer numero es\n%d",num1);
    printf("\nEl segundo entero es\n%d",num2);
    printf("\nSume los dos numeros y escriba el resultado\n");
    scanf("%d",&resultadojugador);
    resultado = num1 + num2;
   
    if(resultadojugador == resultado)
    {
                        printf("Has ganado\n");
                        contador = contador + 1;
                        printf("Numero de vidas restantes\n%d\n",vida);
                        getchar();
    }
    if(resultadojugador != resultado)
    {
                        printf("Has perdido\n");
                        contador = contador + 1;
                        vida = vida - 1;
                        printf("Numero de vidas restantes\n%d\n",vida);
                        getchar();
    }
    }while(vida > 0, contador < 10);
printf("¿Quieres continuar?\nSi quieres, presiona 1. Si quieres salir, presiona 2.\n");
scanf("%d\n",&repetidor);
}while(repetidor == 1);

return 0;

}   
   
   
Ahi esta el Code.

Llamarlas no me cuesta. Entenderlas para que me servirian, me cuesta.

Saludos!


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Caster en 19 Febrero 2012, 20:38 pm
No me meto el tema ya que no puedo ayudar pero te doy unos consejos:

-Cuando escribas code hazlo en la etiquetas Geshi.
-Si declaras variables de mismo tipo, hazlo a la vez.

Código
  1. int x; int y; int z;

-Tambien pudes asignarle el valor cuando las declaras y no después.

Código
  1. int x = 1; int y = 2; int z = 2;

No te lo digo por mal, pero es para que ordenes mejor tu código, sea más fácil de programar y, posteriormente, de entenderlo.


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: rir3760 en 19 Febrero 2012, 21:26 pm
Ahi esta el Code.

Llamarlas no me cuesta. Entenderlas para que me servirian, me cuesta.
El problemas es, al tratar de avanzar demasiado rápido en tu aprendizaje, estas ignorando (por trolling o de forma genuina, no lo se) las recomendaciones que se te dan. Casi al punto de parecer esto un monologo.

Veamos:

En mi primer mensaje indico:
Y casi puedo asegurar que tu error es colocar la llamada a srand justo antes de la llamada a rand: esa es la única explicación para obtener dos veces el mismo numero con llamadas consecutivas a función.

Y si revisamos el código fuente que acabas de publicar:
Código
  1. srand( (unsigned)time( NULL ) ); /* <== */
  2. num1 = rand() % nivel;           /* <== */
  3. srand( (unsigned)time( NULL ) ); /* <== */
  4. num2 = rand() % nivel;           /* <== */

Lo que debes hacer es llamar una única vez a "srand", esto al principio del programa. Después solo llamas a "rand" cuando necesites el siguiente numero de la serie. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define NUM_ELEM 16
  6.  
  7. int main(void)
  8. {
  9.   int i;
  10.  
  11.   /* Definimos la semilla utilizando la hora actual */
  12.   srand((unsigned) time(NULL));
  13.  
  14.   /* Impresion de valores en el rango 0 .. NUM_ELEM - 1 */
  15.   for (i = 0; i < NUM_ELEM; i++)
  16.      printf(" %d", rand() % NUM_ELEM);
  17.   putchar('\n');
  18.  
  19.   return EXIT_SUCCESS;
  20. }

Un saludo


Título: Re: Srand para que den dos numeros diferentes?
Publicado por: Anastacio en 19 Febrero 2012, 22:16 pm
No, mi estupidez es genuina.

Entonces hay que ponerlo al principio, entonces, despues llamo a rand.

Lamento si les cause molestias, no entendia bien.

Muitas gracias