Test Foro de elhacker.net SMF 2.1

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 (cpp) [Seleccionar]
]
#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;

void generar(int codigo);

int main() {

int codigo;
int num;
srand(time(NULL));
// num = rand() % 51;

generar(codigo);

codigo = num;

cout << "numero aleatorio: " << codigo;
 
  return 0;
}

void generar(int codigo) {
// int clave = 1;
// int longitud = 4;
int num;

num = rand() % 51;
  // for (int i = 2; i < longitud; i++) {
       // clave = clave * 10 + (rand() % 3 + 1);
   // }
}


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
CitarSe 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 (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
using namespace std;

void generar(int *c);

int main()
{
    int codigo;
    srand(time(NULL));

    generar(&codigo);
    cout << "numero aleatorio: " << codigo;
   
    return 0;
}

void generar(int *c)
{
    *c = rand() % 51;
}


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.

Citarde 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
Cita de: 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.

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:

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


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

int generar(int *p, int tam)
{
   return p[rand()%tam];
}


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
Cita de: ivancea96 en 22 Enero 2014, 09:10 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 (cpp) [Seleccionar]
// Prototipos...

bool comprobarCoincidencias(int a,int array[],unsigned int tam);
void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

// Otro codigo...

// Declaracion de las funciones

void generarNumeros(int Vector[],unsigned int tam, int max,int min)
{
  // Se presupone que Vector tendrá al menos el tamaño de tam.
 
  if (tam == 0) return;
 
  Vector[0] = rand();

  for (unsigned int i = 1; i < tam;i++)
  {
         do
         {
             Vector[i] = (rand()%max)+min;
         } while (comprobarCoincidencias(Vector[i],Vector,i));
  }
}

bool comprobarCoincidencias(int a,int array[],unsigned int tam)
{
   for (unsigned int j = 0; j < tam;j++)
   {
         if (array[j] == a) return true;
   }

   return false;
}


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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
generarNumeros(vector,tam);      // max = RAND_MAX y min = 0
generarNumeros(vector,tam,10);   // max = 10 y min = 0
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
Cita de: ivancea96 en 22 Enero 2014, 14:28 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
Cita de: amchacon en 22 Enero 2014, 11:46 AM
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 (cpp) [Seleccionar]
// Prototipos...

bool comprobarCoincidencias(int a,int array[],unsigned int tam);
void generarNumeros(int Vector[],unsigned int tam, int max = RAND_MAX,int min = 0);

// Otro codigo...

// Declaracion de las funciones

void generarNumeros(int Vector[],unsigned int tam, int max,int min)
{
  // Se presupone que Vector tendrá al menos el tamaño de tam.
 
  if (tam == 0) return;
 
  Vector[0] = rand();

  for (unsigned int i = 1; i < tam;i++)
  {
         do
         {
             Vector[i] = (rand()%max)+min;
         } while (comprobarCoincidencias(Vector[i],Vector,i));
  }
}

bool comprobarCoincidencias(int a,int array[],unsigned int tam)
{
   for (unsigned int j = 0; j < tam;j++)
   {
         if (array[j] == a) return true;
   }

   return false;
}


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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
generarNumeros(vector,tam);      // max = RAND_MAX y min = 0
generarNumeros(vector,tam,10);   // max = 10 y min = 0
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.