O problema de sortear as posições é que cada chamada de Math.random()
é “independente”, então pode acabar gerando números repetidos (e aí você teria que verificar se aquela posição já foi sorteada, etc).
Em vez disso, você pode usar outra abordagem. Para exemplificar, vamos supor que a matriz tenha 3 linhas e 4 colunas. As posições dos elementos são conforme abaixo (considerando [linha, coluna]
, por exemplo, [1, 3]
é a posição “linha 1, coluna 3”). Lembrando também que a contagem começa em zero (a primeira linha é zero, a segunda é 1, etc):
[0, 0] [0, 1] [0, 2] [0, 3]
[1, 0] [1, 1] [1, 2] [1, 3]
[2, 0] [2, 1] [2, 2] [2, 3]
Mas também podemos numerar as posições assim:
0 1 2 3
4 5 6 7
8 9 10 11
Colocando lado a lado para você ver a correlação entre essas duas formas:
[0, 0] [0, 1] [0, 2] [0, 3] -> 0 1 2 3 - linha zero
[1, 0] [1, 1] [1, 2] [1, 3] -> 4 5 6 7 - linha 1
[2, 0] [2, 1] [2, 2] [2, 3] -> 8 9 10 11 - linha 2
^ ^ ^ ^
| | | |
coluna zero--+ | | +--coluna 3
| |
coluna 1--+ +--coluna 2
E a partir daí podemos derivar uma fórmula para converter de um para outro. Basicamente, a posição 10 está na segunda linha (seria 10 dividido pela quantidade de colunas, arredondado para baixo), e a coluna é o resto da divisão pela quantidade de colunas. Ou seja, dada uma posição pos
qualquer, basta fazer:
int linha = pos / colunas;
int coluna = pos % colunas;
Sendo assim, basta gerar um array contendo todas as posições possíveis (basta multiplicar as quantidades de linhas e colunas da matriz, e você tem a quantidade total de posições possíveis). Depois você embaralha este array, e pega somente as N primeiras (no seu caso é 50, o tamanho do vetor), convertendo cada posição para a respectiva linha e coluna. Assim:
String[] vetor = new int[50];
// cria o vetor
for (int i = 0; i < vetor.length; i++) {
vetor[i] = // etc...
}
// cria a matriz
int qtdLinhas = 10, qtdColunas = 10;
String[][] matriz = new String[qtdLinhas][qtdColunas];
// cria um array contendo todas as posições possíveis da matriz
int[] posicoes = new int[qtdLinhas * qtdColunas];
for (int i = 0; i < posicoes.length; i++) {
posicoes[i] = i;
}
// embaralha as posições (usa o algoritmo Fisher-Yates: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)
Random rnd = new Random();
for (int i = posicoes.length - 1; i > 0; i--) {
int index = rnd.nextInt(i + 1);
int a = posicoes[index];
posicoes[index] = posicoes[i];
posicoes[i] = a;
}
// pega as primeiras 50 posições
for (int i = 0; i < vetor.length; i++) {
int pos = posicoes[i];
// decompõe a posição em linha e coluna
int linha = pos / qtdColunas;
int coluna = pos % qtdColunas;
matriz[linha][coluna] = vetor[i];
}
Assim você evita pegar posições repetidas.