Problema con srand() y rand()

Iniciado por JonaLamper, 14 Enero 2014, 23:45 PM

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

JonaLamper

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
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

xiruko

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.

JonaLamper

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)?
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

xiruko

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.

JonaLamper

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.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

ivancea96

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é?

JonaLamper

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).
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

xiruko

#7
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.

JonaLamper

Uh... no se me había ocurrido la idea de hacer un array con todas las posibilidades. Buena idea ^^
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

ivancea96

Son 360 posibilidades. Mejor haz una funcion que lo verifique.

Enviado desde mi ST21i mediante Tapatalk