Como criar matriz quadrada aleatoria sem repetir numeros com radom?

Estou construindo um método em java para gerar matriz aleatória sem repetir mas estou com dificuldade na hora de criar a logica para fazer os números não repetirem.
esse é o metodo que estou desenvolvendo

public static int[][] geraMatriz(int[][] matriz) {
	Random gerador = new Random();
	for(int i = 0; i < matriz.length; i++) {
		for(int j = 0; j < matriz.length; j++) {
			matriz[i][j]= gerador.nextInt(9);
		
		}
	}
	

	return matriz;

Como você está utilizando matrizes, vai ter que verificar se sua matriz já possui o número gerado.
Crie um método pra isso:

public static int[][] geraMatriz(int[][] matriz) {
    Random gerador = new Random();
    for (int i = 0; i < matriz.length; i++) {
        for (int j = 0; j < matriz[i].length; j++) {
            int numero;
            do {
                numero = gerador.nextInt(9);
            } while (numeroJaExiste(numero, matriz)); // se o número já existe na matriz, gera novamente
            
            matriz[i][j] = numero;
        }
    }

    return matriz;
}

private static boolean numeroJaExiste(int numero, int[][] matriz) {
    for (int i = 0; i < matriz.length; i++) {
        for (int j = 0; j < matriz[i].length; j++) {
            if (matriz[i][j] == numero) {
                return true;
            }
        }
    }
    return false;
}

Agora eu faria o seguinte, criaria uma classe para representar um globo da sorte, igual aqueles utilizados em loterias, e utilizaria ele para alimentar minha matriz.

Classe correspondente ao globo da sorte:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GloboDaSorte {

    private List<Integer> numeros = new ArrayList<>();

    public GloboDaSorte(int de, int ate) {
        for (int numero = de; numero <= ate; numero++) {
            numeros.add(numero);
        }
    }

    public int sortear() {
        if (numeros.isEmpty()) {
            throw new IllegalStateException("Todos os números já foram sorteados!");
        }
        Random random = new Random();
        int sorteado = random.nextInt(numeros.size());
        return numeros.remove(sorteado);
    }
}

O programa em si:

public class Programa {

    public static void main(String[] args) {
        try {
            Programa programa = new Programa();
            programa.executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public void executar() throws Exception {
        int[][] matriz = geraMatriz(4, 4);
        imprimir(matriz);
    }

    public static int[][] geraMatriz(int linhas, int colunas) {
        int tamanhoTotal = linhas * colunas;
        GloboDaSorte globo = new GloboDaSorte(1, tamanhoTotal); // vou gerar números entre 1 e o tamanho total da matriz
        int[][] matriz = new int[linhas][colunas];
        for (int i = 0; i < linhas; i++) {
            for (int j = 0; j < colunas; j++) {
                matriz[i][j] = globo.sortear();
            }
        }
        return matriz;
    }

    private void imprimir(int[][] matriz) {
        for (int i = 0; i < matriz.length; i++) {
            for (int j = 0; j < matriz[i].length; j++) {
                if (j > 0) {
                    System.out.print(" ");
                }
                System.out.printf("%02d", matriz[i][j]);
            }
            System.out.println();
        }
    }
}

Sinto que já vi isso por aqui antes…

2 curtidas

E não tem muito tempo… :thinking:

1 curtida