Para sacar números aleatorios no repetidos del 0 al 9 se me ha ocurrido la siguiente solución, basada en las variables estáticas de una función (conservan el mismo valor de llamada a llamada pero solo pueden accederse desde el interior de la función misma):
int aleatorio(int reinicio) {
// Esta función necesita stdlib.h para funcionar
static int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int retval;
int i, z;
if(reinicio == 0) { // Se ha optado por reiniciar a 0, así dando la posición 0 del array del llamador, la primera
// se reiniciará para poder iterar normalmente. En las demás trabajar de forma normal
for(i=0; i<10; ++i)
array[i] = i;
}
i
= z
= rand()%10; // Obtiene una posición del array interno while((retval = array[i]) == -1) { // Si dicha posición ya ha sido usada (cambiada a 0)
++i; // seguir buscando las siguientes hasta encontrar un valor distinto a 0.
if(i>9) // Por supuesto si superamos el nueve
i=0; // Hay que reiniciar a 0
if(i == z) // Si se ha dado una vuelta completa
break; // salir del bucle. retval valdrá -1, dando a entender que no hay más números a elegir.
}
array[i] = -1; // Una vez encontrado un número válido se marca como usado con el -1;
return retval; // Retornamos el valor encontrado.
}
El resto del programa se puede basar sobre esto:
Puedes crear una matriz de 10 x 10 donde las decenas y a cada fila usar dicho iterador para las decenas del número, de la misma forma a cada columna podrás usar la función (que devolverá 0 a 9) sumando 1 para que vayan de 1 a 10.
También puedes usar la función para, una vez rellena una fila con números aleatorios conseguir 4 posiciones que se llevarán a 0, para marcar un hueco.
Finalmente puedes usar la función para tomar 3 filas aleatorias de la matriz y crear el cartón.
Por ejemplo, la aplicación en la que he basado dicha función ofrece esta salida:
100 --- 099 092 --- 095 --- 093 094 ---
044 --- --- 045 042 --- 046 049 --- 050
063 067 --- --- 071 062 068 --- 065 066
Actualizado el código para eliminar un bucle eterno que se podría producir al pedir un número aleatorio cuando ya se hubieran usado todos.