Hmm... respondiéndote a las partes 1 y 2.
Te recomendaría trabajar con arrays.
A la hora de generar números, verifica si hay duplicados recorriendo el array antes de añadir el nuevo valor.
No tires de variables del tipo fila1, fila2, fila3... En vez de eso hazte un array fila[posición] y recórrelo con un único bucle for que te rellene el array de una tirada.
Similar a esto:
int fila[7];
for(int i=0; i<fila.size(); i++)
{
...
fila[i] = (rand.nextInt((10)+1));
...
}
Para comprobar duplicados, algo del palo:
public boolean comprobarDuplicados(int valor)
{
duplicado=false;
for(int i=0; i<fila.size(); i++)
{
if(fila[i]==valor)
duplicado=true;
}
return duplicado;
}
ALTERNATIVAMENTE, y mucho más práctico, utiliza un HashSet. (No admiten duplicados).
HashSet (Java Platform SE7):
https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.htmlSobre la parte 4, yo suelo hacerlo "extendiendo" el random con condicionales y valores más altos.
Por ejemplo, generamos valores del 0 al 9, pero me interesa que salga más el 9, por decir algo.
Pasos que yo seguiría:
1.- Generar un aleatorio de 0 a 100.
2.- Asignar una parte proporcional de probabilidad a cada número con condicionales.
2.1.- Las condicionales asignarán el valor adecuado.
Ejemplo:
Quiero un 20% de posibilidades para un 9, el resto con probabilidades normales.
Si el valor aleatorio me sale entre 81 y 100, asigno el 9.
Los otros valores se reparten el resto de forma equitativa. (Approx 8).
if(value >= 81 && value < 100)
value = 9;
else
value = value/9
Así salen más nueves que otros números.