[Resolvido] Gerar um número aleatório sem repetição

11 respostas
M

Olá galera!

Sou novo por aqui e estou com uma dúvida. Criei uma Interface Gráfica para rodar um sistema de sorteio. Preciso que ,toda vez que o botão seja apertado, ele gere um número aleatório mas sem que repita.

private void bSortearActionPerformed(java.awt.event.ActionEvent evt) {                                         
        int n=(Integer.parseInt(tParticipantes.getText()));
        int i = 1 + (int)(Math.random() * n);
        String x= String.format("%d",i);
        tNumero.setText(x);
        
}

Consegui fazer que ele gere os números, especificando o numero máximo. Só que as vezes há repetição de um número que já foi sorteado, queria saber como resolver isso?

Espero que ajudem!

11 Respostas

L

guarda os números sorteados numa lista…depois que vc efetua o sorteio, faz uma verificação na lista… se o numero já existir na lista, sorteia novamente

Rodrigo_Sasaki

Utilizando o Math.random() a solução mais rápida que consigo pensar é ter um Set com os números já sorteados.

E

Se você quer algo sem repetição, você precisa pensar como um jogo de bingo.

No bingo, os números não se repetem, mas é porque você os sorteia de uma coleção (de 1 até 99, por exemplo) e depois eles são removidos.

Se você simplesmente usar Math.random, sem ter uma coleção que contém os dados já sorteados, você vai ter o mesmo caso de um jogo de dados - como você deve saber, ao jogar dados, você pode ter números repetidos. Não há nada em um número aleatório que faça com que ele não bata com um número que já saiu.

M

E como ficaria essa lista? Desculpe, mas não faço ideia. =/

Rodrigo_Sasaki

vamos lá, se não quiser seguir a sugestão do entanglement que foi bem bacana, pode fazer o que eu disse acima

crie um Set de números

ao sortear 1 número, verifique se esse número já existe no Set

se já existe
sorteie outro número e verifique novamente
se não existe
adicione o número sorteado ao set, e retorne o valor.

rogeriopaguilar

Vamos supor que o número máximo seja 10. Então você pode fazer um for de 1 a 10 e preencher a lista com estes números (1,2,3 … 10). Depois você embaralha a lista (se eu não me engano tem um método na classe Collections que faz isso, acho que é suffle o nome, tem que ver no javadoc). Depois disso, a cada sorteio, você retira um elemento da lista. Como você pré alocou a lista com os números possíveis de 1 até o número máximo, eles não serão repetidos.

L

E como ficaria essa lista? Desculpe, mas não faço ideia. =/

Com uma lista ou com um Set também funciona tanto faz…o interessante é saber o que já foi sorteado

Faz assim… cria uma List, ou um Vector ou outro qualquer …

depois vc faz o sorteio , compara com cada posição da listagem…
se achou um numero igual ao sorteado na listagem,
então refaz o sorteio…
senão adiciona o numero na litagem e mostra para o usuário o numero sorteado…
então na proxima vez que fizer o sorteio novamente…
este numero sorteado agora já não aparecerá novamente, pois já consta na listagem…

M

Entendi! :smiley:

A comparação seria feita através de um if?

nel

Algo assim não lhe é útil?

List<Integer> numbers = new ArrayList<Integer>(10);
		int n = 0;
		while (n < 10) {
			Random random = new Random();
			int number = random.nextInt(100);
			System.out.println(number);
			if (!numbers.contains(number)) {
				numbers.add(number);
				n++;
			}
		}
L

Mac-Swell:
Entendi! :smiley:

A comparação seria feita através de um if?

Seguindo a ajuda do colega acima…vc poderia implementar mais ou menos assim… (não sei se vai funcionar pois não testei, mas pode seguir a idéia)

List<Integer> numbers = new ArrayList<Integer>();  
private void bSortearActionPerformed(java.awt.event.ActionEvent evt) {                                           
        int n=(Integer.parseInt(tParticipantes.getText()));  
        int i = sorteiaNumero(n);  
        String x= String.format("%d",i);  
        tNumero.setText(x);  
          
}  
public int sorteiaNumero(int n){
     int number = 1 + (int)(Math.random() * n);  
    //se não existir adiciona
     if (!numbers.contains(number)) {  
        numbers.add(number);  
        return number;  
    }  else{
       return sorteiaNumero(n);
   }


}

Talvez tenha que converter o int em Integer ou algo assim pra funcionar,mas daí fica mais fácil compreender a idéia…

M

leopoldof:
Mac-Swell:
Entendi! :smiley:

A comparação seria feita através de um if?

Seguindo a ajuda do colega acima…vc poderia implementar mais ou menos assim… (não sei se vai funcionar pois não testei, mas pode seguir a idéia)

List<Integer> numbers = new ArrayList<Integer>();  
private void bSortearActionPerformed(java.awt.event.ActionEvent evt) {                                           
        int n=(Integer.parseInt(tParticipantes.getText()));  
        int i = sorteiaNumero(n);  
        String x= String.format("%d",i);  
        tNumero.setText(x);  
          
}  
public int sorteiaNumero(int n){
     int number = 1 + (int)(Math.random() * n);  
    //se não existir adiciona
     if (!numbers.contains(number)) {  
        numbers.add(number);  
        return number;  
    }  else{
       return sorteiaNumero(n);
   }


}

Talvez tenha que converter o int em Integer ou algo assim pra funcionar,mas daí fica mais fácil compreender a idéia…

Obrigado, leopoldof! Deu certo com esse seu código.

Obrigado também a todos os outros que ajudaram! Valeu mesmo.

Criado 12 de setembro de 2012
Ultima resposta 13 de set. de 2012
Respostas 11
Participantes 6