[Resolvido] Gerar um número aleatório sem repetição
11 respostas
M
Mac-Swell
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?
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
entanglement
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
Mac-Swell
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
leopoldof
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…
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=newArrayList<Integer>();privatevoidbSortearActionPerformed(java.awt.event.ActionEventevt){intn=(Integer.parseInt(tParticipantes.getText()));inti=sorteiaNumero(n);Stringx=String.format("%d",i);tNumero.setText(x);}publicintsorteiaNumero(intn){intnumber=1+(int)(Math.random()*n);//se não existir adicionaif(!numbers.contains(number)){numbers.add(number);returnnumber;}else{returnsorteiaNumero(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
Mac-Swell
leopoldof:
Mac-Swell:
Entendi!
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=newArrayList<Integer>();privatevoidbSortearActionPerformed(java.awt.event.ActionEventevt){intn=(Integer.parseInt(tParticipantes.getText()));inti=sorteiaNumero(n);Stringx=String.format("%d",i);tNumero.setText(x);}publicintsorteiaNumero(intn){intnumber=1+(int)(Math.random()*n);//se não existir adicionaif(!numbers.contains(number)){numbers.add(number);returnnumber;}else{returnsorteiaNumero(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.