Generar numeros aleatorios, pero sin repetirse. ¿?

Estoy haciendo un homebrew de preguntas y respuestas en PALIB, y claro, no quiero que siempre sea el mismo orden, ni que se repitan preguntas. Por eso os pregunto algun modo de hacer esto.
Yo lo que hago es fabrico un numero aleatorio del 0 al 10 (nº pregunta), lo guardo en un array (cada vez en una celda superior), y para la siguiente pregunta, genero otro numero, pero compruebo si esta en el array (vamos, si esta repetida). Si es así, genera otro numero, y lo vuelve a comprobar, así hasta que encuentra un numero no repetido. La cuestión es que nunca funciona, siempre se repiten.

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.


Claro, al menos en la teoría creo que debería funcionar, pero en la práctica... nanai de la china.
Espero que me podáis ayudar a que no se repitan los numeros aleatorios. Saludos y gracias :)
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.
                      }
               }





te digo, a ojo de buen cubero, eso me parece que es el problema.

SALUDOS!
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!

aja tienes razón, que error más tonto [+risas] [+risas] [+risas]
lo he probado y ya funciona!, muchas gracias por tu ayuda (estoy empezando a programar, solo tengo errores jajaj)
jojojo, todos así empezamos.

SALUDOS !
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.
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.

Muchas gracias por la idea! No se me ocurren cosas tan complejas xD, aunque lo probaré.
Saludos
5 respuestas