int array[20]; //Este array contendrá las preguntas ya formuladas.
int contador; //Para rellenar el array con 0.
int celda = 0; //Celda del array para grabar la pregunta.
int preg;
//Hay mas codigo, pero en este ejemplo sobraría.
int main(){
//Codigo blablabla
for(contador=0;contador<11;contador++){ //Con esto lleno el array de ceros, así no debería haber
array[contador] = 0; //problemas, ya que las preguntas son del 1 al 10.
}
//Codigo blablabla
}
void comprobar_respuesta(int pregunta, int respuesta){
//Codigo blabla comprobación de respuesta...
//Ahora si, la primera pregunta siempre es la 1, pero luego se generan otras.
//Así que grabo la ultima pregunta en el array, para luego comprobar si es repetida.
array[celda] = preg;
celda++; //Asi guardo el numero de pregunta, y paso una celda para grabar la siguiente pregunta.
int celda2; //Para recorrer el array buscando repetido
PA_RandMax(10); //Nueva pregunta
for(celda2=0;celda2<11;celda2++){ //Busco en el array si esta repetido.
if(control[celda2] == preg){ //Si esta repetido, se genera otro numero.
preg = PA_RandMax(10);
}
}
}
//Fin, ahora se supone que se muestra la pregunta, y se vuelve a generar otra.
int celda2; //Para recorrer el array buscando repetido
PA_RandMax(10); //Nueva pregunta
for(celda2=0;celda2<11;celda2++){ //Busco en el array si esta repetido.
if(control[celda2] == preg){ //Si esta repetido, se genera otro numero.
preg = PA_RandMax(10);
celda2=0; //inicializa de nuevo el contador para buscar de nuevo en las que ya pasaron.
}
}
luis_mikau escribió:bueno no me he puesto a revizar tu codigo asi a fondo, pro aparentemente este es el problema:int celda2; //Para recorrer el array buscando repetido
PA_RandMax(10); //Nueva pregunta
for(celda2=0;celda2<11;celda2++){ //Busco en el array si esta repetido.
if(control[celda2] == preg){ //Si esta repetido, se genera otro numero.
preg = PA_RandMax(10);
celda2=0; //inicializa de nuevo el contador para buscar de nuevo en las que ya pasaron.
}
}
j
te digo, a ojo de buen cubero, eso me parece que es el problema.
SALUDOS!
Animal_Borra escribió:No se si vendrá mucho a cuento ya pero este es el típico problema de "no repetir número aleatorio", y aunque a priori siempre se intenta resolver como tú lo haces eso puede provocar que se tarde mucho en generar un número no repetido. Me explico: Digamos que de las 10 preguntas ya has hecho 9 y sólo te queda 1, la número 4 pej. El programa podría estar generando números infinitinamente hasta que "le de" por el 4, son probabilidades.
¿Entonces que?... por regla general lo que se hace es generar un array dinámico (o punteros) e ir quitando elementos según se saque del "conjunto" (no se como iran las PALib la verdad).
1. Creamos un array con 10 posiciones, cada posición guardara lo que veas conveniente (lo lógico sería el número de la pregunta)
- {1,2,3,4,5,6,7,8,9,10}
2. Generamos número aleatorio (MAX longitud del array) -> Ej random generado: 7
3. Miramos el elemento de nuestro array de la 7a posición -> 7
4. Eliminamos el 7o elemento
- {1,2,3,4,5,6,8,9,10}
5. Vuelta al paso 2 (la longitud del array se reduce en 1...obviamente)
Dependiendo de lo que permita las librerias el paso 4 podrás hacerlo más facil o dificil. Poniendonos en el peor de los casos y que no tengamos arrays dinámicos y no quieras liarte con punteros y listas enlazadas una opción sería coger TODOS los elementos del array a partir del Random y hasta la longitud del array tomen el valor del siguiente elemento (como si desplazaramos todos los valores hacia la izquierda a partir del random), y ya con otra variable indicariamos la nueva longitud del array.
Así nunca se te quedaría "colgado" el programa.
Suerte.