Java - Matriz - Números aleatórios

Estou a tentar criar um algoritmo que introduza 6 valores numa matriz 2x3 de forma automática, não permitindo números repetidos. Só que não estou a perceber como faço para comparar e não permitir números aleatórios repetidos… :face_with_raised_eyebrow: :thinking:

package aula_6;

import java.util.Random;
import java.util.Scanner;

public class aula_6_ex_2 {
  
  public static void main(String[] args) {
    Scanner ler = new Scanner(System.in);
    int[][] vet = new int[2][3];
    int i, j;
    Random x = new Random();//cria uma variável do tipo random
    
    for (i = 0; i < vet.length; i++) {
      for (j = 0; j < vet.length; j++) {
        vet[i][j] = x.nextInt(100);//meti até 100 para criar n.ºs aleatórios até aqui
      }
    }
    
    for (i = 0; i < vet.length; i++) {
      for (j = 0; j < vet.length; j++) {
        if (vet[i] == vet[j]) {
          System.out.println("erro--nr repetido");
        } else {
          System.out.println(vet[i][j]);
        }
      }
    }
  }
}

Pense num bingo, onde há o lugar onde ficam as bolinhas que serão sorteadas e, na medida em que o sorteio for acontecendo, as bolinhas são removidas.

Vc pode implementar algo semelhante à forma como um bingo funciona. Crei o lugar onde ficarão os números a serem sorteados, e vá preenchendo a matriz com esses números até que não tenha mais nenhum número para ser sorteado.

Verificar se o número já saiu antes não é uma boa, porque não adianta só verificar o último, vc teria que percorrer todos os números gerados até então.

Para matrizes pequenas pode até “funcionar”, mas conforme a matriz cresce isso se torna inviável. Imagine uma matriz 10x10, por exemplo (ou seja, com cem números). Quando for preencher o 90° número, vc tem que verificar os 89 anteriores pra saber se o número não se repete. Se ele é repetido, tem que gerar outro e verificar tudo de novo. Depois para o 91º número, tem que verificar os 90 anteriores e assim por diante.

Pior ainda, se os valores possíveis são de 0 a 99 (ou seja, 100 valores possíveis para preencher uma matriz 10x10), isso quer dizer que no final os números gerados por nextInt têm mais chance de serem repetidos. Ou seja, serão necessários cada vez mais iterações até que se gere um número que ainda não saiu. Portanto, este é um método que não escala bem.

Uma alternativa simples para o seu caso é usar o algoritmo de Fisher-Yates. Basicamente, primeiro vc cria uma lista com todos os números possíveis - como você usou nextInt(100), quer dizer que os valores são números de 0 a 99:

// cria uma lista contendo todos os números de 0 a 99

// Para Java >= 8, pode usar streams
List<Integer> numerosPossiveis = IntStream.range(0, 100).boxed().collect(Collectors.toList());

//--------------------------------------------
// Para Java < 8, preencha a lista manualmente
List<Integer> numerosPossiveis = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    numerosPossiveis.add(i);
}

Depois, basta embaralhar a lista e percorrê-la normalmente, adicionando os elementos na matriz:

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

// matriz 2x3
int linhas = 2, colunas = 3;
int[][] matriz = new int[linhas][colunas];

Iterator<Integer> it = numerosPossiveis.iterator();
// preenche a matriz com os números
for (int i = 0; i < linhas; i++) {
    for (int j = 0; j < colunas; j++) {
        matriz[i][j] = it.next(); // simplesmente pega o próximo número da lista
    }
}

Como a lista foi embaralhada, a matriz será preenchida de forma aleatória.

Obviamente, você deve garantir que a lista numerosPossiveis tem uma quantidade suficiente de valores para preencher a matriz.

Excelente exemplo @Lucas_Camara , neste post tem até um exemplo de como fazer isso.

1 curtida