Tentando Random de todas as formas e números ainda repetem!

Olá pessoal! já tentei de várias formas utilizando matrizes ou arrays ou ainda arraylists com o random, e TODOS no resultado de execução aparecem números repetidos! Vou dar o exemplo do código abaixo q utilizei daqui mesmo do GUJ:

public class ExerArray {
		public static void main (String[] args){
			Random gera = new Random ();
			int[][] numAle = new int [2][41];
			int maiorNum = 0;
			int linha = 0;
			int coluna = 0;
			for (int i = 0 ; i < numAle.length ; i++){
				for (int j = 0 ; j<numAle[i].length ; j++){
					numAle[i][j] = gera.nextInt(40)+1;
					System.out.print (numAle[i][j] + " ");
					if (numAle[i][j] > maiorNum){
						maiorNum = numAle[i][j];
						linha = i;
						coluna = j;
					}
				}
				System.out.println ("");
			}
			linha++;
			coluna++;
			System.out.println ("");
			System.out.println ("O maior numero é : " + maiorNum + " na linha " + linha  + " e na coluna " + coluna);
		}
	}

Saída no terminal:

40 9 2 23 21 6 1 6 32 4 29 18 23 1 23 25 34 5 24 16 28 22 11 14 21 38 26 8 36 3 12 2 10 18 25 24 2 33 28 2 36
40 7 5 32 27 5 12 8 31 24 18 7 30 35 18 29 1 25 13 28 1 12 15 5 33 18 23 12 20 10 25 34 7 28 10 40 26 15 39 17 8

O maior numero é : 40 na linha 1 e na coluna 1

repetem alguns números em negrito, tanto em uma coluna como na outra…
Minha ideia a príncipio é embaralhar 40 números e dividir esses numeros embaralhados em dois posteriormente e trabalhar os mesmos como se fossem cartas, mas não cartas comuns, mais pro estilo UNO… mas esse é um dos códigos que utilizei quando percebi que o que estava tentando fazer não dava certo (por esse mesmo problema de repetir números). Podem me dar uma luz o que estou fazendo de errado?

O Random apenas gera número aleatórios, ele não garante que, num dado conjunto de números gerados, não haverá repetições. Se você precisa gerar números sem repetição, precisa verificar por conta própria se o número recém sorteado já existe. Algo assim (obs: não otimizado e não testado, é só de exemplo):

{
   Random gera = new Random();
   List<Integer> lista = new ArrayList<>();
   int numero;
   boolean existe;
   while (lista.size() < 10){
     numero = gera.nextInt();
     existe = false;
     for (int i = 0; i < lista.size(); i++){
         if (lista.get(i).getIntValue() == numero){
            existe = true;
            break; // numero já existe
         }
      }
   if (!existe){
      lista.add(numero); // se número não existe, adiciona na lista
   }
  }
}

Só que, vendo o que você quer fazer, você pode selecionar 40 números sequenciais e embaralhá-los. Ou seja, os números não precisam ser gerados aleatoriamente de primeira. Algo assim:

List<Integer> lista = new ArrayList<>();

for(int i= 0; i <40; i++){
  lista.add(i+1);
}

Collections.shuffle(lista); // embaralha a lista

for(int i= 0; i <lista.size(); i++){
  System.out.print(" " + (lista.get(i).intValue() ) );
}

Se nada disso chega perto do que você quer, explique melhor o problema que está tentando resolver.

Abraço.

Pode ser feito assim também:

Random gera = new Random();
int linha = 2;
int coluna = 42;
int[][] numAle = new int [linha][coluna];       
ArrayList<Integer> num = new ArrayList<>(linha * coluna);

for(int j = 0; j < (linha * coluna); j++)
{            
	num.add(j);
}

for (int i = 0 ; i < numAle.length ; i++)
{
	for (int j = 0 ; j<numAle[i].length ; j++)
	{
		int index = gera.nextInt(num.size()); 
		numAle[i][j] = num.get(index);                
		num.remove(index);                
	}                
}        

System.out.println ("            Imprimindo resultados");             
System.out.println ("=============================================="); 


for (int i = 0 ; i < numAle.length ; i++)
{
	for (int j = 0 ; j < numAle[i].length ; j++)
	{
	   System.out.printf("%2d ", numAle[i][j]);               
	   
	}                
	System.out.println ("");
}

IDEONE

Mas acredito que a estrutura elaborada e respondido por @TerraSkilll seja a melhor:

Collections.shuffle(lista);

Dragoon, obrigado pelas correções na pergunta e pela resposta rápida! Mas ainda não deu certo. O TerraSkill me deu uma ideia tbm que irei tentar, já utilizei o shuffle, mas de maneira diferente… Agradeço muito pelas respostas! Assim que eu testar esse shuffle do TerraSkill eu tento melhorar minha pergunta ou posto que funcionou.

Talvez não estamos te entendendo …!