Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Generar numero aleatorio

Estas en el tema de Generar numero aleatorio en el foro de C/C++ en Foros del Web. Holas. Se que para generar un numero aleatorio existe la funcion rand() y srand(), pero lo que a mi me interesa es que durante un ...
  #1 (permalink)  
Antiguo 15/02/2010, 07:50
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Generar numero aleatorio

Holas.

Se que para generar un numero aleatorio existe la funcion rand() y srand(), pero lo que a mi me interesa es que durante un dia entero me devuelva el mismo numero.

Pongo un ejemplo:

dia 1 -> numero 20
dia 2 -> numero 3
dia 3 -> numero 12
etc.

Durante un dia entero el valor que me devuelva la funcion sea el mismo, pero que sea aleatorio de un dia para otro.

Mi version es la siguiente:

Utilizo la funcion time() y paso los milisegundos a dias (dividiendo por 86400). Me devuelve un numero entre 1 y 10, pero como se ve no es para nada aleatorio. El valor que me devuelve en un mismo dia siempre es el mismo, pero al dia siguiente solamente incrementa en 1 (si hoy me devuelve 12345 mañana me devolvera 12346).

Código:
int getRandomNum (){
	time_t tiempo;

	tiempo = time (NULL);
	tiempo = (tiempo/86400)%10;

	if (tiempo == 0) tiempo = 1;

	return tiempo;
}
Hay alguna forma para hacerlo aleatorio de un dia para otro?

Gracias.
  #2 (permalink)  
Antiguo 15/02/2010, 18:25
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 16 años
Puntos: 6
Respuesta: Generar numero aleatorio

Buenas,

A ver que te parece esto:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. int main() {
  5.     time_t rawtime;
  6.     struct tm * timeinfo;
  7.     char day[ 4 ], year[ 5 ];
  8.     int i, y, numeroAleatorio;
  9.  
  10.     time( &rawtime );
  11.     timeinfo = localtime( &rawtime );
  12.  
  13.     strftime( day, 4, "%j", timeinfo );
  14.     strftime( year, 5, "%Y", timeinfo );
  15.  
  16.     y = atoi( year );
  17.     srand( atoi( day ) );
  18.     for( i = 0; i < y; i++ ) numeroAleatorio = (int) ( rand() % 100 ); //Pon tantos 0 al 100 como cifras necesites
  19.  
  20.     printf( "%i\n", numeroAleatorio );
  21.     return 0;
  22. }

La idea es:
1) Cogemos el día (del año) en el que estamos. Esto nos da un valor entre 1 y 366
2) Cogemos el año en el que estamos
3) Iniciamos la semilla con el día del año (si siempre inicias con la misma semilla, siempre obtienes la misma lista de números)
4) Si el número tiene que cambiar con cada año, haces un bucle desde 0 hasta el año en el que estás obteniendo números y te quedas con el último

EDITO: Si no necesitas que el número sea diferente cada año, puedes quitar el bucle y liberar carga de procesador. Por otro lado, que el número sea diferente, te permite verificar que año se creó el número

Las ventajas:
- El número se mantiene constante al largo de un mismo día
- Dos días consecutivos no tienen porqué tener dos números aleatorios relacionados
- Los mismos días de distintos años tendrán números distintos
- Permite verificar el día y el año en que se emitió un número

Desventajas:
- No uses este algoritmo para nada relacionado con la criptografía, la seguridad, etc. Los números generados con este algoritmo son fácilmente predecibles por cualquiera que conozca el algoritmo (y, aunque no se conozca, nunca se debe dejar a la suerte)

Saludos y suerte
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM

Última edición por genuine_carlosV2; 15/02/2010 a las 18:48
  #3 (permalink)  
Antiguo 17/02/2010, 02:33
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 0
De acuerdo Respuesta: Generar numero aleatorio

Gracias.

Al final lo deje asi:

Código:
int getRandomNum (){
        time_t tiempo;
        struct tm *timeinfo;
        char day[4];

        time (&tiempo);
        timeinfo = localtime (&tiempo);
        strftime (day, 4, "%j", timeinfo);

        srand (atoi (day));

        return rand ()%4 + 2;
}
Me devuelve un numero entre 2 y 5 y se mantiene igual durante todo el dia porque cada vez que se llama a la funcion se inicializa la secuencia de numeros aleatorios con srand() y por tanto, como rand() solo se llama una vez, siempre me devuelve el mismo numero. Al dia siguiente, como el day ha cambiado srand() inicia la secuencia con otro numero diferente.

He descubierto 2 funciones: el localtime() y el strftime() que sin duda son muy interesantes ;)

No me hacia falta tanta precision con lo del año, pero gracias igualmente.

Etiquetas: numero, aleatoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:59.