Array de números aleatórios sem repetição

5 respostas
intprogramaçãojava
G

Alguém poderia me ajudar e dizer qual o problema nesse código que fiz? Ele continua repetindo os números, queria algo que fizesse preencher um array, sem repetição e sem o uso de listas e coleções.

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int[] sorteio = new int[10];
		
		for (int i = 0; i < sorteio.length; i++){
			int a = rand();
			sorteio[i] = a;
			for(int j = i; j >= 0; j--){
				if (a == sorteio[j]){
					boolean igual = true;
					do {
						a = rand();
						if (a != sorteio[j]){
							igual = false;
							sorteio[j] = a;
						}
					}while(igual);
					
					
				} 
			}
		}
		
		for (int i = 0; i < sorteio.length; i++){
			System.out.println(sorteio[i]);
		}
	}
	
	public static int rand(){
		int sorteio = (int) (Math.random()*11);
		return sorteio;
	}
}

5 Respostas

4

@gmenezes.dev
Fiz da seguinte forma jovem:

Meu método para gerar numeros:
Perceba que usei Random() ao invés de Math.random(), por questão de gosto.

public int[] gerarNumeros() {
    Random random = new Random();
    int[] sorteio = new int[10];
    for (int i = 0; i < sorteio.length; i++) {
        boolean novoNumero = false;
        int numero = -1;
        while (!novoNumero) {
            numero = random.nextInt(50); // isso gera ate 49, se quiser gerar ate 10 coloque 11
            novoNumero = verificarExistencia(numero, sorteio);
        }
        sorteio[i] = numero;
    }
    return sorteio;
}

Aqui fica o método que verifica existencia:

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

Se quiser ordena-los faça o seguinte no evento que vc esta usando para sortear:

int[] numeros = gerarNumeros();
    Arrays.sort(numeros);
    jLabel1.setText(Arrays.toString(numeros));

Você citou na sua questão que n queria repetições, pois acredito ser impossível. Pense bem, vc precisa verificar cada numero de sua lista e ainda por cima gerar um novo numero quando aquele gerado anteriormente ja possui.

Fique com a app que montei caso precise:
GerarNumero.rar (15,9 KB)

G

@4mega

Você citou na sua questão que n queria repetições, pois acredito ser impossível. Pense bem, vc precisa verificar cada numero de sua lista e ainda por cima gerar um novo numero quando aquele gerado anteriormente ja possui.

Obrigado por me responder, 4mega. Por quê impossível? É possível verificar a lista, então, ainda não consegui pegar a ideia de ser impossível. Desculpe a identação do código, espaçada demais.

Estava tentando um jeito mais preciso aqui e olhando o seu código, que achei interessante sua forma de fazer, cheguei em uma conclusão aqui, ainda bagunçada, mas consegui que esses números chegassem a ser mais preciso quanto a NÃO se repetir. Embora exista ainda uma remota chance de repetição.

Nesse código vai de 0 - 4;

import java.util.*;

public class Main {
	public static void main(String[] args) {
		int[] valores = new int[5];
		Random gera = new Random();
		
		for(int i = 0; i < valores.length; i++){
			valores[i] = gera.nextInt(5);
		}
		//mais precisão repetindo o laço for abaixo.	
		for (int i = 0; i < valores.length; i++){
			for (int j = 0; j < valores.length; j++){
				while (valores[i] == valores[j] && j != i){
					valores[i] = gera.nextInt(5);
					for(int b = 0; b < valores.length; b++){
						while (valores[i] == valores[b] && b != i){
							valores[i] = gera.nextInt(5);
							if (valores[i] == valores[b]){
								continue;
							}
						}
					}
					
				}
			}
		}
		
		
		for (int i = 0; i < valores.length; i++){
			for (int j = 0; j < valores.length; j++){
				while (valores[i] == valores[j] && j != i){
					valores[i] = gera.nextInt(5);
					for(int b = 0; b < valores.length; b++){
						while (valores[i] == valores[b] && b != i){
							valores[i] = gera.nextInt(5);
							if (valores[i] == valores[b]){
								continue;
							}
						}
					}

				}
			}
		}
		
		for (int valor : valores){
			System.out.println(valor);
		}
	}
}

Quanto mais eu repito o laço do For mais precisão eu tenho.

P

Impossivel é uma palavra que nunca pode existir :slight_smile:

Para o teu problema tens duas soluções:

A facil:

List<Integer> valores = Arrays.asList(0,1,2,3,4);
Collections.shuffle(valores);

for (int valor : valores){
     System.out.println(valor);
}

A que segue o algoritmo que pretendes:

int[] valores = new int[5];
    Random gera = new Random();

    int i = 0;
    while (i < valores.length) {
        valores[i] = gera.nextInt(5);
        boolean colide = false;
        for (int j = 0; j < i; j++){
            if (valores[i] == valores[j]){
                colide = true;
                break;
            }               
        }
        if (!colide){
            i++;
        }
    }

    for (int valor : valores){
        System.out.println(valor);
    }
G

@pmlm

Exatamente isso, a segunda forma, Parabéns @pmlm! :slight_smile:

A

Vejo que já postaram uma resposta correta, porém segue abaixo minha sugestão:

Random gerador = new Random();
List<Integer> valores = new ArrayList<Integer>();
int tamanho = 10; // 
while (valores.size() < tamanho) {
    Integer num = gerador.nextInt(11/* valores entre 0 e 10 */);
    if (!valores.contains(num)) {
        valores.add(num);
        System.out.println(num);
    }
}
Criado 3 de janeiro de 2017
Ultima resposta 4 de jan. de 2017
Respostas 5
Participantes 4