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();
}
}
}
}
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.
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).