Como posso ta impedindo repeticao de numeros gerado?

Ola pessoal estou criando esse gerador de numeros preciso de 5 colunas e linhas so que nao consigo impedir a repetição se alguem poder ajudar agradeco. Obrigado !!

package heranca;

import java.util.Random;

public class zeroAcCEm {

public static void main(String[] args) {
    
    Random gerador = new Random();
    int A = 0, B = 0;
       for (int i = 0; i < 4; i++) {
            //100 porque vai gerar apenas ate 99 nada maior que isso
            A = gerador.nextInt(100);    
           System.out.printf(" [%d] ", A);
        for (int j = 0; j < 4; j++) {
             B = gerador.nextInt(100); 
           System.out.printf(" [%d] ", B); 
            }
            System.out.println("");
        }   
}
}

Acho que o jeito mais simples seria gerar uma lista já preenchida com os 100 números, depois vc embaralha a lista e pega apenas os 20 primeiros números. Seria algo assim:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class App {
  public static void main(String... args) {
    int capacity = 100;

    List<Integer> list = new ArrayList<>(capacity);

    for (int i = 0; i < capacity; i++) {
      list.add(i);
    }

    Collections.shuffle(list);

    for (int i = 0; i < 20; i++) {
      System.out.printf(" [%2d] ", list.get(i));

      if ((i + 1) % 5 == 0) {
        System.out.println();
      }
    }
  }
}
4 curtidas

Se for usar lista, basta usar um grupo Set que não permite a adição de objetos repetidos. Algo simples tipo:

Random gerador = new Random();

Set lista = new LinkedList;

do {
    lista.add(gerador.nextInt(100));
    } while (lista.count() < 20);

System.out.println("Resultados: ");

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

Não estou no Eclipse agora para testar, mas o código ficaria mais ou menos assim.

1 curtida

eu somente nao entendi esta condição

Isso serve para identificar números que são múltiplos de 5.

Sempre que i + 1 for 5, 10 ou 15, ele vai inserir a quebra de linha para a matriz aparecer certinha na tela.

O problema desta abordagem é nos casos em que o tamanho da amostra é muito próximo do total de elementos.

Por exemplo, se forem números de 1 a 100 e eu quero pegar 95 deles. Quando a lista tiver mais de 50 elementos, a chance de gerar um número repetido é maior do que a de gerar um novo. Então o loop se repetirá várias vezes até encontrar um número que ainda não está no Set. E quanto mais números na lista, maior é a chance de gerar repetições e de precisar de várias iterações até surgir um novo número.

Claro que para poucos elementos isso não chega a ser um problema, mas para casos como esse eu acho melhor usar o que já foi sugerido acima: embaralhar os elementos e pegar os N primeiros (aliás, esse algoritmo é conhecido como Fisher-Yates).

1 curtida