en el segundo, sinceramente llevo varios días y a un no logro hallar la manera de como hacer que el random no genere números repetidos. Agradecería algo de apoyo.
Una forma que se me ocurre, usando los elementos básicos disponibles a este nivel (con 
Clases y 
Programacion Orientada Objetos podría ser más fácil), es la siguiente:
Sería recorrer el arreglo/vector/array (como queramos llamarlo...) y por cada una de sus posiciones, generar un numero random.
Antes de aceptarlo, volver a recorrer de nuevo el vector y comprobar si el numero random ya existe en el o no.
Si no existe, lo aceptamos y pasamos a la siguiente posicion.
Si existe, entonces lo descartamos, volvemos  a generar otro y repetimos la misma comprobacion.. así hasta que se genere un numero que no exista.
Entonces, para hacer esto, se necesitaría tres bucles anidados:
Primero, un bucle 
for que recorra las posiciones del vector, una a una...
Segundo, un bucle 
do...while donde se generarán números random 
mientras dichos números estén siendo descartados. Solo se detendrá cuando el número random haya sido aceptado.
Tercero, otro bucle 
for (uso un 
for each en este caso) que recorre todo el vector y comprueba si el numero random existe o no.
Si existe, indicaremos al bucle 
while que el número ha sido descartado para que siga repitiendose.
Si no existe, lo aceptamos  y le indicaremos al 
while que ya puede terminar.
Esto se lo comunicaremos con una variable booleana, que yo he llamado 
descartadoTe adjunto un programa donde se hace esto, para que lo veas y decidas si quieres incluirlo en tu programa.
Por curiosidad, he incluido un contador de numeros descartados. Así al final del programa se muestran los números generados al azar y también se informa de cuantos números han sido descartados durante el proceso.
import java.util.Random;
public final class SinRepetir {
	public static void main(String[] args) {
		Random rn = new Random();
		int[] numeros = new int[10];//Aqui indicamos cuantos queremos generar, 10 en este caso
		boolean descartado;
		int contDescartados = 0; //Por curiosidad, contaremos cuantos numeros random serán descartados
		
		/*
		 * Recorreremos las posiciones del vector una a una.
		 * Para cada una de ellas, generaremos un numero al azar y antes de aceptarlo
		 * volveremos a recorrer el vector completo para comprobar si el numero generado
		 * ya existe en el vector.
		 * Si no existe, lo aceptaremos y pasaremos a la siguiente posicion.
		 * Si existe, es decir, está repetido, lo descartaremos y volveremos a generar otro
		 * hasta que aparezca uno que no exista
		 */
		for (int i = 0; i < numeros.length; i++)
		{
			do//Este bucle se repetirá hasta que salga un numero random no repetido, es decir, mientras descartado == true
			{
				int numeroRandom = rn.nextInt(50) + 1;//Generamos entero entre 1 y 50
				descartado = false;//De momento, el numero no está descartado
				
				//Ahora recorremos el vector completo y comprobamos si el numero generado ya existe dentro de él
				for (int numVector: numeros)
				{
					if (numVector == numeroRandom)//EL numero generado ya existe en el vector, hay que descartarlo
					{
						descartado = true;//Lo descartamos
						contDescartados++;//Contamos el descarte, por curiosidad...
						break;//Finalizamos bucle for, no hace falta seguir comparando
					}
				}
				
				//Tras comprobar si el numero estaba repetido, ahora decidimos si aceptamos el numero random generado
				if (!descartado)//No ha sido descartado, lo aceptamos. El bucle do..while terminará y pasaremos al siguiente numero del vector
					numeros[i] = numeroRandom;
			}while (descartado);
		}
		
		//Mostramos números generados
		for (int n: numeros)
			System.out.print(n + " ");
		
		System.out.println("\nSe han descartado " + contDescartados + " numeros random");
	}
}