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

[SOLUCIONADO] Problema con funcion rand

Estas en el tema de Problema con funcion rand en el foro de C/C++ en Foros del Web. Hola a todos tengo el siguiente algoritmo @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include <iostream> #include <time.h> #include <stdlib.h> using namespace std ;   int ...
  #1 (permalink)  
Antiguo 27/03/2014, 17:03
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Problema con funcion rand

Hola a todos tengo el siguiente algoritmo

Código C++:
Ver original
  1. #include <iostream>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6. int main(){
  7.  int x,aux,n,*vec,i;
  8.  cout<<"Digite longitud del vector: ";
  9.  cin>>n;
  10.  vec=new int[n];
  11.  
  12.  for(i=0;i<n;i++){
  13.     aux=rand()%100;
  14.     x=aux-1;
  15.     for(x;x>1;x--){
  16.         if(aux%x==0){
  17.             aux=rand()%100;
  18.             x=aux;
  19.             }else vec[i]=aux;
  20.     }
  21.  }
  22.   for(int i=0;i<n;i++){
  23.         cout<<vec[i]<<"\n";
  24.  
  25.  }
  26. }

El algoritmo genera numeros aleatorios pero solo conserva los numeros primos, el problema es que si me genera numeros primos pero de vez en cuando sale numeros pares y cuando vuelvo y ejecuto el programa salen los mismo numeros que ya habian salido en la ejecucion anterior.
  #2 (permalink)  
Antiguo 27/03/2014, 17:58
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 2 meses
Puntos: 83
Respuesta: Problema con funcion rand

Tienes que iniciar con una 'semilla':

Código C:
Ver original
  1. srand(time(NULL));

En este caso se inicia con el objeto de la fecha actual. Esto solo debes hacerlo al iniciar la aplicacion o cada vez que quieras refrescar la semilla, en tu caso solo al iniciar la aplicacion. Cuando has llamado a srand ya puedes ejecutar rand.

Saludos
vosk
  #3 (permalink)  
Antiguo 27/03/2014, 19:55
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Problema con funcion rand

una idea :D
cualquier numero multiplicado por 2 es par.
Como lo mantamos...
Una forma de tener un numero siempre par:
Si me da el numero 91 (IMPAR) le divido por 2...
91 / 2
resultado 45. Ahora lo multiplico por 2
45*2
me da el 90 matando así aquel uno que era molesto y no nos aleja para nada por ejemplo del numero original por si lo queríamos números pares de 0 a 100 XDD

y para el impar solo le tienes que ver si es par. Tienes 2 opciones:
Una o no haces nada hasta que te de un par.
Otra si quieres que agilice y te de un numero par a la fuerza, si te da por ejemplo el numero 80, le sumas uno o le restas uno.
int n=80;
if( n%2 ==0 )
n = n+1;

Obien

int n=80;
if( n%2 ==0 )
n = n-1;


debes cuidar para que si por ejemplo quieres números entre 0 a 100 que no te pase ni de 0 abajo ni de 100 arriba sino seria un desastre XDD

por cierto, para números aleatorios uso:
int desde = 0;
int hasta = 100;
int aux = ( desde + rand() % (hasta - desde) );

así es como me va muy bien XDD

Ah XDD
Y debes llamar antes a srand() como te dijo vosk
srand() necesita una semilla la s es de seed que en ingles es la semilla.
srand() hace que rand() genere números según el numero que le pongas. Por ejemplo:
srand(157);
El problema es que si pones un numero fijo siempre te da los mismos números. Ahí es donde entra time(NULL) que obtiene de numero la hora del ordenador y como la hora no repite en 24horas pues a menos que ejecutes el rand() 2 veces al mismo instante cosa que es improbable por no decir imposible XDDD
Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <windows.h>
  4. using namespace std;
  5.  
  6. int aleatorio(int desde, int hasta);
  7.  
  8. int main (){
  9.     srand(time(NULL));
  10.     int num = 0;
  11.     int n = 0;
  12.    
  13.     // Poner aqui el rango de numeros que desea generar, ejemplo: desde 0 hasta 100.
  14.     int desde = 0;
  15.     int hasta = 100;
  16.  
  17.     cout << "cuantas numeros aleatorios quieres generar?: ";
  18.     cin >> num;
  19.     int box[num];
  20.  
  21.     for ( int i = 0 ; i < num ; i++ ){
  22.         n = aleatorio( desde, hasta );
  23.         Sleep (10);                    
  24.         box[i] = n; //si los quiere guardar                    
  25.         cout <<  "arreglo [" << i << "] contiene: " << box[i] << endl;  
  26.     }                                  
  27.  
  28.     cin.ignore();
  29.     return 0;
  30. }//FIN DE MAIN
  31.  
  32. int aleatorio( int desde, int hasta ) {
  33.     // rand syntax: <int> = (<numeromenor> + rand() % ( <numeromayor> - <numeromenor> ) )
  34.     int n = ( desde + rand() % (hasta - desde) );
  35.     return n;
  36. }//FIN DE ALEATORIO

Última edición por vangodp; 27/03/2014 a las 20:06
  #4 (permalink)  
Antiguo 15/04/2014, 17:17
 
Fecha de Ingreso: febrero-2014
Mensajes: 107
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Problema con funcion rand

Asi lo pude generar bien lo que pasaba era que si llegaba a generar un 2 y le restaba uno en la condicion del for no se cumpliria y lo que haria es generar cualquier valor por eso me salian numeros pares; igual que en el tuyo que tambn me genera numeros pares. Pero me parecio interesante tu logica.
Código C++:
Ver original
  1. #include <iostream>
  2. #include <time.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6. int main(){
  7.  int x,aux,n,*vec,i;
  8.  srand(time(NULL));
  9.  cout<<"Digite longitud del vector: ";
  10.  cin>>n;
  11.  vec=new int[n];
  12.  
  13.  for(i=0;i<n;i++){
  14.     aux=3+(rand()%92);
  15.     x=aux-1;
  16.     for(x;x>1;x--){
  17.         if(aux%x==0){
  18.             aux=3+(rand()%92);
  19.             x=aux;
  20.             }else vec[i]=aux;
  21.     }
  22.  }
  23.   for(int i=0;i<n;i++){
  24.         cout<<vec[i]<<"\n";
  25.  
  26.  }
  27. }
Cita:
Iniciado por vangodp Ver Mensaje
una idea :D
cualquier numero multiplicado por 2 es par.
Como lo mantamos...
Una forma de tener un numero siempre par:
Si me da el numero 91 (IMPAR) le divido por 2...
91 / 2
resultado 45. Ahora lo multiplico por 2
45*2
me da el 90 matando así aquel uno que era molesto y no nos aleja para nada por ejemplo del numero original por si lo queríamos números pares de 0 a 100 XDD

y para el impar solo le tienes que ver si es par. Tienes 2 opciones:
Una o no haces nada hasta que te de un par.
Otra si quieres que agilice y te de un numero par a la fuerza, si te da por ejemplo el numero 80, le sumas uno o le restas uno.
int n=80;
if( n%2 ==0 )
n = n+1;

Obien

int n=80;
if( n%2 ==0 )
n = n-1;


debes cuidar para que si por ejemplo quieres números entre 0 a 100 que no te pase ni de 0 abajo ni de 100 arriba sino seria un desastre XDD

por cierto, para números aleatorios uso:
int desde = 0;
int hasta = 100;
int aux = ( desde + rand() % (hasta - desde) );

así es como me va muy bien XDD

Ah XDD
Y debes llamar antes a srand() como te dijo vosk
srand() necesita una semilla la s es de seed que en ingles es la semilla.
srand() hace que rand() genere números según el numero que le pongas. Por ejemplo:
srand(157);
El problema es que si pones un numero fijo siempre te da los mismos números. Ahí es donde entra time(NULL) que obtiene de numero la hora del ordenador y como la hora no repite en 24horas pues a menos que ejecutes el rand() 2 veces al mismo instante cosa que es improbable por no decir imposible XDDD
Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <windows.h>
  4. using namespace std;
  5.  
  6. int aleatorio(int desde, int hasta);
  7.  
  8. int main (){
  9.     srand(time(NULL));
  10.     int num = 0;
  11.     int n = 0;
  12.    
  13.     // Poner aqui el rango de numeros que desea generar, ejemplo: desde 0 hasta 100.
  14.     int desde = 0;
  15.     int hasta = 100;
  16.  
  17.     cout << "cuantas numeros aleatorios quieres generar?: ";
  18.     cin >> num;
  19.     int box[num];
  20.  
  21.     for ( int i = 0 ; i < num ; i++ ){
  22.         n = aleatorio( desde, hasta );
  23.         Sleep (10);                    
  24.         box[i] = n; //si los quiere guardar                    
  25.         cout <<  "arreglo [" << i << "] contiene: " << box[i] << endl;  
  26.     }                                  
  27.  
  28.     cin.ignore();
  29.     return 0;
  30. }//FIN DE MAIN
  31.  
  32. int aleatorio( int desde, int hasta ) {
  33.     // rand syntax: <int> = (<numeromenor> + rand() % ( <numeromayor> - <numeromenor> ) )
  34.     int n = ( desde + rand() % (hasta - desde) );
  35.     return n;
  36. }//FIN DE ALEATORIO

Última edición por shikamarucb; 15/04/2014 a las 17:20 Razón: faltaba

Etiquetas: numeros, rand
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 17:38.