numeros al azar

Iniciado por mapers, 7 Agosto 2010, 00:43 AM

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

mapers

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 (cpp) [Seleccionar]



#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <time.h>

using namespace std;

int vector[1000000];

bool isEven(int n)
{
   int math = n%2;
   if(math==0)
   return true;
   else
   return false;
}
unsigned int ciclo(unsigned int curValue, unsigned int count)
{
   if(curValue == 1) return count;

   if(isEven(curValue))

   return ciclo(curValue/2, count+1);

   else

   return ciclo((curValue*3)+1, count+1);
}


unsigned int maxCiclo(unsigned long comienzo, unsigned long fin)
{
   unsigned int curMax = 0;

   if(comienzo> fin)

   swap(comienzo, fin);//swap intercambia los valores si start> stop

   for(unsigned int i=comienzo; i<=fin;i++)
   {
       unsigned int tempciclo;

       if(vector[i] == 0)
       {
           tempciclo = ciclo(i, 1);

          vector[i] = tempciclo;
       }
       else tempciclo = vector[i];

       if(tempciclo>curMax)

       curMax = tempciclo;
   }

   return curMax;
}


int getMilisegundos(clock_t c)
{
int tiempo=0;
tiempo = (int)((c/(double)CLOCKS_PER_SEC)*1000) ;
return tiempo;
}




int main(int argc, char *argv[])

   {
       
       clock_t t1, t2;
       srand(time(NULL));
   unsigned int comienzo;
   unsigned int fin;

   for(int i=0;i<1000;i++)
   {
   
       t1 = clock();
   comienzo=i+1;
   fin=(rand() % 10000);      
       maxCiclo(comienzo, fin);
        t2 = clock();
       printf("%d   %d   %f \n",comienzo,fin,getMilisegundos(t2-t1));
       t1=t2=0;
     
}



   system("PAUSE");
}


Anco

Compara los numeros que te arroja la funcion rand, y si uno es igual al anterior has que se repita la funcion.
???

mapers

como asi me podrian ayudar a corregir esto ayudenme con la parte de medir el tiempo en milisegundos .........

[L]ord [R]NA

Explica bien que es lo que quieres hacer porque a mi no me repite secuencia de numeros y no lo he modificado

mapers

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

Akai

prueba a hacer lo siguiente:

        t1 = clock();
    comienzo=i+1;
for(j=0;j<10;j++){   
fin=(rand() % 10000);     
        maxCiclo(comienzo, fin);
}
         t2 = clock();
        printf("%d   %d   %f \n",comienzo,fin,getMilisegundos(t2-t1/10));
        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.

mapers

nada igual no sale nada a ver pueder correjirll completo porfa°°°

Akai

#7
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 (cpp) [Seleccionar]
1000*(t2-t1)/CLOCKS_PER_SEC)

mapers

#8
mira lo hize asi y me sigue saliendo numeros constantes y asi no deve ser inclusive hasta puros ceros.... chekalo
Código (cpp) [Seleccionar]


#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include "windows.h"

using namespace std;

int vector[1000000];

bool isEven(int n)
{
   int math = n%2;
   if(math==0)
   return true;
   else
   return false;
}
unsigned int ciclo(unsigned int curValue, unsigned int count)
{
   if(curValue == 1) return count;

   if(isEven(curValue))

   return ciclo(curValue/2, count+1);

   else

   return ciclo((curValue*3)+1, count+1);
}


unsigned int maxCiclo(unsigned long comienzo, unsigned long fin)
{
   unsigned int curMax = 0;

   if(comienzo> fin)

   swap(comienzo, fin);//swap intercambia los valores si start> stop

   for(unsigned int i=comienzo; i<=fin;i++)
   {
       unsigned int tempciclo;

       if(vector[i] == 0)
       {
           tempciclo = ciclo(i, 1);

          vector[i] = tempciclo;
       }
       else tempciclo = vector[i];

       if(tempciclo>curMax)

       curMax = tempciclo;
   }

   return curMax;
}




double getMilisegundos(clock_t c)
{
   int tiempo=0;
   tiempo = (int)((c/(double)CLOCKS_PER_SEC)*1000) ;
   if(tiempo == 0){
       printf("Warning!: el procesamiento tomó menos de 1 milisegundo, retornando cantidad de clicks");
       return c;
   }
   return tiempo;
}



int main(int argc, char *argv[])

   {
     // freopen ("mapers.txt","w",stdout);
     
       
       clock_t t1, t2;
       srand(time(NULL));
   unsigned int comienzo;
   unsigned int fin;
   int i=0;
   
for(i=0;i<1000;i++)
{
   
       t1 = clock();
 
     comienzo=rand()%59663;
     
      fin=rand()%66666;
         maxCiclo(comienzo, fin);
         Sleep(20);
       
         t2 = clock();
         printf("%d\n",t1);
         printf("%d\n",t2);
       printf("%d   %d   %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
 
   }
   system("pause");
//return 0;
   
}






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

mmm y me sigue saliendo puros ceros !!!

luinuz


/**
* 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

srand(time(NULL));

Y listo.