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.
]
#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
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í:
#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.
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)?
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.
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.
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é?
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).
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.
Uh... no se me había ocurrido la idea de hacer un array con todas las posibilidades. Buena idea ^^
Son 360 posibilidades. Mejor haz una funcion que lo verifique.
Enviado desde mi ST21i mediante Tapatalk
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:
// 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:
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:
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
Con 4 cifras y 6 posibilidades, son 360. 6*5*4*3.
Enviado desde mi ST21i mediante Tapatalk
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:
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:
// 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:
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:
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.