Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JonaLamper en 14 Enero 2014, 23:45 pm



Título: Problema con srand() y rand()
Publicado por: JonaLamper en 14 Enero 2014, 23:45 pm
Se acabó, no aguanto más. Llevo 35 minutos intentando solucionar esto y no veo dónde está el fallo. Lo único que quiero conseguir es generar números aleatorios mediante un procedimiento Void. Y no sé por qué, siempre me genera el mismo número, soy incapaz de ver el maldito error.

Código
  1. ]
  2. #include <iostream>
  3. #include <string>
  4. #include <fstream>
  5. #include <ctime>
  6. #include <cstdlib>
  7. using namespace std;
  8.  
  9. void generar(int codigo);
  10.  
  11. int main() {
  12.  
  13. int codigo;
  14. int num;
  15. srand(time(NULL));
  16. // num = rand() % 51;
  17.  
  18. generar(codigo);
  19.  
  20. codigo = num;
  21.  
  22. cout << "numero aleatorio: " << codigo;
  23.  
  24.   return 0;
  25. }
  26.  
  27. void generar(int codigo) {
  28. // int clave = 1;
  29. // int longitud = 4;
  30. int num;
  31.  
  32. num = rand() % 51;
  33.   // for (int i = 2; i < longitud; i++) {
  34.        // clave = clave * 10 + (rand() % 3 + 1);
  35.    // }
  36. }

Gracias y ojala me ayudéis porque me estoy volviendo loco (seguro que después es una tontería, para variar...)

Pd: ignorar los comentarios  :xD


Título: Re: Problema con srand() y rand()
Publicado por: xiruko en 15 Enero 2014, 00:01 am
Citar
Se acabó, no aguanto más. Llevo 35 minutos...

Si quieres seguir en esto me parece que tendrás que aprender a tener un poco más de paciencia... xD

Y bueno en cuanto al código, no sé de que te sorprendes si nunca cambias el valor de la variable 'codigo'. O imprimes dentro de la función la variable local 'num', o pasas la variable 'codigo' por referencia a la función para así poder modificar su valor. Esta última opción te quedaría así:

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <ctime>
  4. #include <cstdlib>
  5. using namespace std;
  6.  
  7. void generar(int *c);
  8.  
  9. int main()
  10. {
  11.    int codigo;
  12.    srand(time(NULL));
  13.  
  14.    generar(&codigo);
  15.    cout << "numero aleatorio: " << codigo;
  16.  
  17.    return 0;
  18. }
  19.  
  20. void generar(int *c)
  21. {
  22.    *c = rand() % 51;
  23. }

Aunque hacer una función para eso pues como que tampoco haría falta... Pero bueno eso ya es cosa tuya.

Saludos.


Título: Re: Problema con srand() y rand()
Publicado por: JonaLamper en 15 Enero 2014, 00:34 am
Muchas gracias. No veía el ponerle un parámetro por referencia al procedimiento  :-\

Ya... pero son las normas de la práctica xD

Oye, cómo haces para que al insertar un código, reconozca que se trata de C++ (por ejemplo)?


Título: Re: Problema con srand() y rand()
Publicado por: xiruko en 15 Enero 2014, 00:38 am
De nada.

Respecto a lo del código en colores, cuando editas un mensaje tienes una pestaña con el nombre de GeSHi que despliega todas las etiquetas para varios lenguajes de programación. En el caso de C++ tendrías que pegar el código entre las etiquetas [ code=cpp] ... [ /code], sin espacios claro.

Saludos.


Título: Re: Problema con srand() y rand()
Publicado por: JonaLamper en 21 Enero 2014, 17:20 pm
Pongo aquí mi duda para no abrir otro tema.

Es posible generar un número con srand (en mi caso, de longitud 4 e intervalo [0,5]) y asegurarse de en esos 4 dígitos, no hay ninguno repetido?

He pensando en guardar el valor anterior generado y compararlo con el nuevo... pero no sé si es una buena idea, porque dicho número generado va dentro de un array.


Título: Re: Problema con srand() y rand()
Publicado por: ivancea96 en 21 Enero 2014, 17:46 pm
Recuerda que Srand no genera número aleatorio. Pone la semilla para Rand.

Si te quieres asegurar, deberás hacerlo a mano, con una función, por ejemplo.

Citar
de longitud 4 e intervalo [0,5]

Longitud 4 e intervalo 0,5 el qué?


Título: Re: Problema con srand() y rand()
Publicado por: JonaLamper en 21 Enero 2014, 21:46 pm
Recuerda que Srand no genera número aleatorio. Pone la semilla para Rand.

Si te quieres asegurar, deberás hacerlo a mano, con una función, por ejemplo.

Longitud 4 e intervalo 0,5 el qué?

El código generado (mediante una función que contiene un For, por ejemplo).


Título: Re: Problema con srand() y rand()
Publicado por: xiruko en 21 Enero 2014, 23:39 pm
Longitud 4, números entre [0,5] y sin repetir? Te refieres a números tipo: 1234 5432 etc? Es que no queda muy claro tal y como lo dices pero diría que es eso.

Si es así, podrías hacer un array de enteros con todas las posibilidades tipo:

Código
  1. int combinaciones[]={1234, 2341, 3412, 2341, 1235, 2351, 3512, 5123, ...};
  2. int tam=sizeof(combinaciones)/sizeof(combinaciones[0]);

Y luego para generar un número u otro podrías hacer:

Código
  1. int generar(int *p, int tam)
  2. {
  3.    return p[rand()%tam];
  4. }

Claro que también podrías rellenar el array con un par de ciclos for para ahorrárte el escribirlos a mano. O también podrías declarar el array de enteros dentro de la función y así te ahorras esos parámetros... En fin, era solo una idea.

Saludos.


Título: Re: Problema con srand() y rand()
Publicado por: JonaLamper en 22 Enero 2014, 00:17 am
Uh... no se me había ocurrido la idea de hacer un array con todas las posibilidades. Buena idea ^^


Título: Re:
Publicado por: ivancea96 en 22 Enero 2014, 09:10 am
Son 360 posibilidades. Mejor haz una funcion que lo verifique.

Enviado desde mi ST21i mediante Tapatalk


Título: Re:
Publicado por: amchacon en 22 Enero 2014, 11:46 am
Son 360 posibilidades. Mejor haz una funcion que lo verifique.
Con 4 cifras son 24 posibilidades (4 x 3 x 2 x 1).

En cuanto al tema en cuestión te dejo otra propuesta más generica:

Código
  1. // Prototipos...
  2.  
  3. bool comprobarCoincidencias(int a,int array[],unsigned int tam);
  4. void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);
  5.  
  6. // Otro codigo...
  7.  
  8. // Declaracion de las funciones
  9.  
  10. void generarNumeros(int Vector[],unsigned int tam, int max,int min)
  11. {
  12.   // Se presupone que Vector tendrá al menos el tamaño de tam.
  13.  
  14.   if (tam == 0) return;
  15.  
  16.   Vector[0] = rand();
  17.  
  18.   for (unsigned int i = 1; i < tam;i++)
  19.   {
  20.          do
  21.          {
  22.              Vector[i] = (rand()%max)+min;
  23.          } while (comprobarCoincidencias(Vector[i],Vector,i));
  24.   }
  25. }
  26.  
  27. bool comprobarCoincidencias(int a,int array[],unsigned int tam)
  28. {
  29.    for (unsigned int j = 0; j < tam;j++)
  30.    {
  31.          if (array[j] == a) return true;
  32.    }
  33.  
  34.    return false;
  35. }

No lo he probado pero debería funcionar. Tienes que pasarle el vector que quieres que te rellene, el numero de cifras y el máximo/menor (no inclusivo) valor que puede coger cada cifra. En este caso el maximo sería 10 porque quieres números del 0-9 supongo.

Por cierto:
Código
  1. void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

Los "=" son son argumentos por defecto. Si no le dices nada el compilador te los rellena automaticamente:

Código
  1. generarNumeros(vector,tam);      // max = RAND_MAX y min = 0
  2. generarNumeros(vector,tam,10);   // max = 10 y min = 0
  3. generarNumeros(vector,tam,10,1); // max = 10 y min = 1


Título: Re:
Publicado por: ivancea96 en 22 Enero 2014, 14:28 pm
Con 4 cifras y 6 posibilidades, son 360. 6*5*4*3.

Enviado desde mi ST21i mediante Tapatalk


Título: Re:
Publicado por: amchacon en 22 Enero 2014, 15:13 pm
Con 4 cifras y 6 posibilidades, son 360. 6*5*4*3.
Huy es verdad, menudo despiste :silbar:


Título: Re:
Publicado por: ivancea96 en 22 Enero 2014, 16:34 pm
Con 4 cifras son 24 posibilidades (4 x 3 x 2 x 1).

En cuanto al tema en cuestión te dejo otra propuesta más generica:

Código
  1. // Prototipos...
  2.  
  3. bool comprobarCoincidencias(int a,int array[],unsigned int tam);
  4. void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);
  5.  
  6. // Otro codigo...
  7.  
  8. // Declaracion de las funciones
  9.  
  10. void generarNumeros(int Vector[],unsigned int tam, int max,int min)
  11. {
  12.   // Se presupone que Vector tendrá al menos el tamaño de tam.
  13.  
  14.   if (tam == 0) return;
  15.  
  16.   Vector[0] = rand();
  17.  
  18.   for (unsigned int i = 1; i < tam;i++)
  19.   {
  20.          do
  21.          {
  22.              Vector[i] = (rand()%max)+min;
  23.          } while (comprobarCoincidencias(Vector[i],Vector,i));
  24.   }
  25. }
  26.  
  27. bool comprobarCoincidencias(int a,int array[],unsigned int tam)
  28. {
  29.    for (unsigned int j = 0; j < tam;j++)
  30.    {
  31.          if (array[j] == a) return true;
  32.    }
  33.  
  34.    return false;
  35. }

No lo he probado pero debería funcionar. Tienes que pasarle el vector que quieres que te rellene, el numero de cifras y el máximo/menor (no inclusivo) valor que puede coger cada cifra. En este caso el maximo sería 10 porque quieres números del 0-9 supongo.

Por cierto:
Código
  1. void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

Los "=" son son argumentos por defecto. Si no le dices nada el compilador te los rellena automaticamente:

Código
  1. generarNumeros(vector,tam);      // max = RAND_MAX y min = 0
  2. generarNumeros(vector,tam,10);   // max = 10 y min = 0
  3. generarNumeros(vector,tam,10,1); // max = 10 y min = 1

También puedes hacer una función más genérica, pasándole un array con las cifras permitidas, y un int con el número de cifras del número que quieres generar.