Srand para que den dos numeros diferentes?

Iniciado por Anastacio, 16 Febrero 2012, 20:35 PM

0 Miembros y 1 Visitante están viendo este tema.

Anastacio

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.
You, stop to close my post, you were novice too!!!!!!!!!!!!

armizh

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.
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

Akai

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.

rir3760

Cita de: Anastacio en 16 Febrero 2012, 20:35 PMEn 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.

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Anastacio

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?
You, stop to close my post, you were novice too!!!!!!!!!!!!

rir3760

Cita de: Anastacio en 17 Febrero 2012, 13:43 PMsi 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.

Cita de: Anastacio en 17 Febrero 2012, 13:43 PMEntonces, 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Eternal Idol

Me sumo a rir3760:

CONSEGUITE UN LIBRO "Anastacio".
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Anastacio

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.

You, stop to close my post, you were novice too!!!!!!!!!!!!

Eternal Idol

Cita de: Anastacio en 19 Febrero 2012, 17:10 PMYa 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.

Cita de: Anastacio en 19 Febrero 2012, 17:10 PMSi, 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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Anastacio

#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!
You, stop to close my post, you were novice too!!!!!!!!!!!!