Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mapers en 7 Agosto 2010, 00:43 am



Título: numeros al azar
Publicado por: mapers en 7 Agosto 2010, 00:43 am
holas gente del foro quisiera que me ayuden con este problema que tengo esque la funcion  rand casi siempre me bota los mismos numero   quisiera que me dijeran como poder hacer que me bote numeros distinos...o existe otro metodo para sacar numeros al azar
ademas porque siempre me salen que (tiempo 2  -tiempo 1) siempre me salen  0 en todos los casos
Código
  1.  
  2.  
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include<stdlib.h>
  7. #include <time.h>
  8.  
  9. using namespace std;
  10.  
  11. int vector[1000000];
  12.  
  13. bool isEven(int n)
  14. {
  15.    int math = n%2;
  16.    if(math==0)
  17.    return true;
  18.    else
  19.    return false;
  20. }
  21. unsigned int ciclo(unsigned int curValue, unsigned int count)
  22. {
  23.    if(curValue == 1) return count;
  24.  
  25.    if(isEven(curValue))
  26.  
  27.    return ciclo(curValue/2, count+1);
  28.  
  29.    else
  30.  
  31.    return ciclo((curValue*3)+1, count+1);
  32. }
  33.  
  34.  
  35. unsigned int maxCiclo(unsigned long comienzo, unsigned long fin)
  36. {
  37.    unsigned int curMax = 0;
  38.  
  39.    if(comienzo> fin)
  40.  
  41.    swap(comienzo, fin);//swap intercambia los valores si start> stop
  42.  
  43.    for(unsigned int i=comienzo; i<=fin;i++)
  44.    {
  45.        unsigned int tempciclo;
  46.  
  47.        if(vector[i] == 0)
  48.        {
  49.            tempciclo = ciclo(i, 1);
  50.  
  51.           vector[i] = tempciclo;
  52.        }
  53.        else tempciclo = vector[i];
  54.  
  55.        if(tempciclo>curMax)
  56.  
  57.        curMax = tempciclo;
  58.    }
  59.  
  60.    return curMax;
  61. }
  62.  
  63.  
  64. int getMilisegundos(clock_t c)
  65. {
  66. int tiempo=0;
  67. tiempo = (int)((c/(double)CLOCKS_PER_SEC)*1000) ;
  68. return tiempo;
  69. }
  70.  
  71.  
  72.  
  73.  
  74. int main(int argc, char *argv[])
  75.  
  76.    {
  77.  
  78.        clock_t t1, t2;
  79.        srand(time(NULL));
  80.    unsigned int comienzo;
  81.    unsigned int fin;
  82.  
  83.    for(int i=0;i<1000;i++)
  84.    {
  85.  
  86.        t1 = clock();
  87.    comienzo=i+1;
  88.    fin=(rand() % 10000);      
  89.        maxCiclo(comienzo, fin);
  90.         t2 = clock();
  91.        printf("%d   %d   %f \n",comienzo,fin,getMilisegundos(t2-t1));
  92.        t1=t2=0;
  93.  
  94. }
  95.  
  96.  
  97.  
  98.    system("PAUSE");
  99. }
  100.  


Título: Re: numeros al azar
Publicado por: Anco en 7 Agosto 2010, 01:46 am
Compara los numeros que te arroja la funcion rand, y si uno es igual al anterior has que se repita la funcion.


Título: Re: numeros al azar
Publicado por: mapers en 7 Agosto 2010, 03:25 am
como asi me podrian ayudar a corregir esto ayudenme con la parte de medir el tiempo en milisegundos .........


Título: Re: numeros al azar
Publicado por: [L]ord [R]NA en 7 Agosto 2010, 07:35 am
Explica bien que es lo que quieres hacer porque a mi no me repite secuencia de numeros y no lo he modificado


Título: Re: numeros al azar
Publicado por: mapers en 7 Agosto 2010, 12:27 pm
mi duda es porque siempre  sale tiempo 0 en todos los casos que se dan .......
me podrian ayudar a corregir esa parte ....eso numas gracias


Título: Re: numeros al azar
Publicado por: Akai en 7 Agosto 2010, 13:15 pm
prueba a hacer lo siguiente:

Código
  1.        t1 = clock();
  2.    comienzo=i+1;
  3. for(j=0;j<10;j++){    
  4. fin=(rand() % 10000);      
  5.        maxCiclo(comienzo, fin);
  6. }
  7.         t2 = clock();
  8.        printf("%d   %d   %f \n",comienzo,fin,getMilisegundos(t2-t1/10));
  9.        t1=t2=0;

de esta forma debería funcionarte. Realizas 10 veces la búsqueda y luego obtienes el tiempo. Debido a la velocidad de los procesadores actuales, el realizar el cálculo con una sola iteración, en este caso te da tiempos infinitesimales.


Título: Re: numeros al azar
Publicado por: mapers en 7 Agosto 2010, 14:00 pm
nada igual no sale nada a ver pueder correjirll completo porfa°°°


Título: Re: numeros al azar
Publicado por: Akai en 8 Agosto 2010, 23:26 pm
Tu problema está en la conversión de tiempos que realizas. La función getMilisegundos no produce el resultado que tu deseas, por tanto, para obtener el resultado que tu buscas al medir el tiempo entre t1 y t2 y que se exprese en milisegundos una opción sería la siguiente:

Código
  1. 1000*(t2-t1)/CLOCKS_PER_SEC)


Título: Re: numeros al azar
Publicado por: mapers en 10 Agosto 2010, 02:48 am
mira lo hize asi y me sigue saliendo numeros constantes y asi no deve ser inclusive hasta puros ceros.... chekalo
Código
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include<stdlib.h>
  6. #include <time.h>
  7. #include "windows.h"
  8.  
  9. using namespace std;
  10.  
  11. int vector[1000000];
  12.  
  13. bool isEven(int n)
  14. {
  15.    int math = n%2;
  16.    if(math==0)
  17.    return true;
  18.    else
  19.    return false;
  20. }
  21. unsigned int ciclo(unsigned int curValue, unsigned int count)
  22. {
  23.    if(curValue == 1) return count;
  24.  
  25.    if(isEven(curValue))
  26.  
  27.    return ciclo(curValue/2, count+1);
  28.  
  29.    else
  30.  
  31.    return ciclo((curValue*3)+1, count+1);
  32. }
  33.  
  34.  
  35. unsigned int maxCiclo(unsigned long comienzo, unsigned long fin)
  36. {
  37.    unsigned int curMax = 0;
  38.  
  39.    if(comienzo> fin)
  40.  
  41.    swap(comienzo, fin);//swap intercambia los valores si start> stop
  42.  
  43.    for(unsigned int i=comienzo; i<=fin;i++)
  44.    {
  45.        unsigned int tempciclo;
  46.  
  47.        if(vector[i] == 0)
  48.        {
  49.            tempciclo = ciclo(i, 1);
  50.  
  51.           vector[i] = tempciclo;
  52.        }
  53.        else tempciclo = vector[i];
  54.  
  55.        if(tempciclo>curMax)
  56.  
  57.        curMax = tempciclo;
  58.    }
  59.  
  60.    return curMax;
  61. }
  62.  
  63.  
  64.  
  65.  
  66. double getMilisegundos(clock_t c)
  67. {
  68.    int tiempo=0;
  69.    tiempo = (int)((c/(double)CLOCKS_PER_SEC)*1000) ;
  70.    if(tiempo == 0){
  71.        printf("Warning!: el procesamiento tomó menos de 1 milisegundo, retornando cantidad de clicks");
  72.        return c;
  73.    }
  74.    return tiempo;
  75. }
  76.  
  77.  
  78.  
  79. int main(int argc, char *argv[])
  80.  
  81.    {
  82.      // freopen ("mapers.txt","w",stdout);
  83.  
  84.  
  85.        clock_t t1, t2;
  86.        srand(time(NULL));
  87.    unsigned int comienzo;
  88.    unsigned int fin;
  89.    int i=0;
  90.  
  91. for(i=0;i<1000;i++)
  92. {
  93.  
  94.        t1 = clock();
  95.  
  96.      comienzo=rand()%59663;
  97.  
  98.       fin=rand()%66666;
  99.          maxCiclo(comienzo, fin);
  100.          Sleep(20);
  101.  
  102.          t2 = clock();
  103.          printf("%d\n",t1);
  104.          printf("%d\n",t2);
  105.        printf("%d   %d   %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
  106.  
  107.    }
  108.    system("pause");
  109. //return 0;
  110.  
  111. }
  112.  
  113.  
  114.  
  115.  
  116.  

Lh: No hagas doble post, la próxima borro.

mmm y me sigue saliendo puros ceros !!!


Título: Re: numeros al azar
Publicado por: luinuz en 10 Agosto 2010, 19:31 pm
Código:
/**
 * Funcion que devuelve un numero aleatorio entre min y max
 */
int int_aleatorio(int min, int max) {
return ((max-min+1)/(RAND_MAX+1.0))*rand()+min;
}

Luego en el main o en la funciona que llame a int_aleatorio debes llamar a

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

Y listo.


Título: Re: numeros al azar
Publicado por: mapers en 13 Agosto 2010, 07:18 am
ya weno   gracias pero tengo una duda mas queria exportar datos de un texto y hacer que los evalue la funcion,me corre pero no me guarda los datos a ver si me dan una manita .....................
Código
  1.  
  2. int main()
  3. {
  4. FILE *archivo;
  5. int caracter;
  6. clock_t t1, t2;
  7.    srand(time(NULL));
  8.    unsigned int comienzo;
  9.    unsigned int fin;
  10.  
  11. archivo = fopen("entrada.in","r");
  12. freopen ("mapers.txt","w",stdout);
  13.  
  14. if (archivo == NULL){
  15.  
  16. printf("\nError de apertura del archivo. \n\n");
  17.        }else{
  18.  
  19.  
  20.  
  21.  
  22.    while (feof(archivo) == 0)
  23.  
  24.    {
  25.  
  26.  
  27. comienzo = fgetc(archivo);
  28. scanf("% d",&comienzo);
  29. fin = fgetc(archivo);
  30.           scanf("% d",&fin);
  31.  t1 = clock();
  32. maxCiclo(comienzo, fin);
  33.  
  34.  
  35.          t2 = clock();
  36.  
  37.         printf("%d\n",t2);
  38.        printf("%d   %d   %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
  39.  
  40.    }
  41.    }
  42.  
  43.  
  44. return 0;
  45. }
  46.  
  47.  


Título: Re: numeros al azar
Publicado por: do-while en 13 Agosto 2010, 13:40 pm
http://c.conclase.net/librerias/index.php?ansifun=freopen#inicio


Título: Re: numeros al azar
Publicado por: mapers en 13 Agosto 2010, 16:07 pm
si si lo abro pero no se escribe nada cuando lo quiero guardar en otro documento de texto  :huh: :huh: :huh: :huh: :huh:


Título: Re: numeros al azar
Publicado por: leogtz en 13 Agosto 2010, 16:54 pm
Tal vez será porque no estás cerrando el archivo abierto por freopen(), en este caso el dispositivo stdout.

Código
  1. if(freopen ("mapers.txt","w",stdout) == NULL)
  2. {
  3. perror("Error abriendo archivo");
  4. exit(EXIT_FAILURE);
  5. }
  6. /* Código */
  7. fclose(stdout);
  8. ...
  9.  



Título: Re: numeros al azar
Publicado por: mapers en 13 Agosto 2010, 17:08 pm
mira esque quiero ingresar estos numeros pero igual no me los guarda al contrario  se satura     :-( :-( :-( :-(

quiero ingresar numeros desde el texto asi:

99994 99999 99996 -99999 -99999 -99999 99994 -99993 -99999 99997 -99994 100000 -99998 99991 99991 100000 -99999 -99999 -99993 -99996 -99999 100000 99994 99991 100000 -99998 -99993 99999 -99991 99994 99992 -99995 -99996 -99994 99993 99996 99995 -99998 100000 -100000 -99991 99995 99995 99990 99990 99999 -99999 99998 -99997 -99990 -99999 100000 99998 99999 -99990 99990 -99999 -99999 -99993 100000 99997 99997 -99990 -99996

para que me los lea uno a uno .... pero igual  me lee pero no los guarda...

mi duda es como hacer para poder capturar cada  numero porque la funcon quye tengo me toma caracter por caracter....


Título: Re: numeros al azar
Publicado por: leogtz en 13 Agosto 2010, 17:20 pm
Utiliza otra sentencia como fputs(), fprintf(), a ver si hace el trabajo.


Título: Re: numeros al azar
Publicado por: mapers en 13 Agosto 2010, 17:42 pm
oks mira asi cheka
Código
  1. int main()
  2. {
  3. FILE *archivo;
  4. int maper=0 ,caracter=0;
  5. clock_t t1, t2;
  6.    unsigned int comienzo;
  7.    unsigned int fin;
  8.  
  9.  
  10. freopen ("mapers.txt","w",stdout);
  11. freopen("entrada.in","r",stdin);
  12.  
  13.        t1 = clock();
  14. for(int i=0;i<100;i++)
  15. {
  16.  
  17. cin>>caracter;
  18. cin>>fin;
  19. maxCiclo(comienzo, fin);
  20.     t2 = clock();
  21.        printf("%d   %d   %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
  22.  
  23.    }
  24.  
  25.      fclose(stdout);
  26.      fclose ( stdin );
  27.  
  28. return 0;
  29. }
  30.  
  31.  

mira lo unico que me falta es como poder  hacer para tomar el primer numero con "comienzo" y el segundo numero con "fin" hasta que termine de leerlo todo......

poruqe si  lo coloca asi me tira error cheka  

mejor es trabajarlo asi ???
2383 886
777 1915
1793 2335
2386 492
2649 421
362 1027
2690 2059
1763 2926
540 426
172 736
1211 368
567 429
782 125