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
#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");
}
Compara los numeros que te arroja la funcion rand, y si uno es igual al anterior has que se repita la funcion.
como asi me podrian ayudar a corregir esto ayudenme con la parte de medir el tiempo en milisegundos .........
Explica bien que es lo que quieres hacer porque a mi no me repite secuencia de numeros y no lo he modificado
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
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.
nada igual no sale nada a ver pueder correjirll completo porfa°°°
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:
1000*(t2-t1)/CLOCKS_PER_SEC)
mira lo hize asi y me sigue saliendo numeros constantes y asi no deve ser inclusive hasta puros ceros.... chekalo
#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 !!!
/**
* 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.
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 .....................
int main()
{
FILE *archivo;
int caracter;
clock_t t1, t2;
srand(time(NULL));
unsigned int comienzo;
unsigned int fin;
archivo = fopen("entrada.in","r");
freopen ("mapers.txt","w",stdout);
if (archivo == NULL){
printf("\nError de apertura del archivo. \n\n");
}else{
while (feof(archivo) == 0)
{
comienzo = fgetc(archivo);
scanf("% d",&comienzo);
fin = fgetc(archivo);
scanf("% d",&fin);
t1 = clock();
maxCiclo(comienzo, fin);
t2 = clock();
printf("%d\n",t2);
printf("%d %d %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
}
}
return 0;
}
http://c.conclase.net/librerias/index.php?ansifun=freopen#inicio
si si lo abro pero no se escribe nada cuando lo quiero guardar en otro documento de texto :huh: :huh: :huh: :huh: :huh:
Tal vez será porque no estás cerrando el archivo abierto por freopen(), en este caso el dispositivo stdout.
if(freopen ("mapers.txt","w",stdout) == NULL)
{
perror("Error abriendo archivo");
exit(EXIT_FAILURE);
}
/* Código */
fclose(stdout);
...
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....
Utiliza otra sentencia como fputs(), fprintf(), a ver si hace el trabajo.
oks mira asi cheka
int main()
{
FILE *archivo;
int maper=0 ,caracter=0;
clock_t t1, t2;
unsigned int comienzo;
unsigned int fin;
freopen ("mapers.txt","w",stdout);
freopen("entrada.in","r",stdin);
t1 = clock();
for(int i=0;i<100;i++)
{
cin>>caracter;
cin>>fin;
maxCiclo(comienzo, fin);
t2 = clock();
printf("%d %d %.16g milisegundos\n",comienzo,fin,getMilisegundos( t2-t1) );
}
fclose(stdout);
fclose ( stdin );
return 0;
}
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