Classe para apresentar um vetor com números aleatórios sem repetiçoes
5 respostas
Octaviano_DIniz
Caros participantes,
Estou iniciando no mundo Java e tenho um trabalho para apresentar, um programa com um jogo de perguntas e respostas.
Tenho o programa rodando perfeito, porém, ele não está impedindo que uma pergunta seja repetida e fiz a seguinte classe, mas não está funcionando.
Será que alguém pode ajudar.
Atenciosamente.
Octaviano Diniz
public class EmbaralharNumeros {
private int total;
Se você precisa embaralhar os números de 1 a N, então não faça do jeito que você fez - Math.random funciona exatamente igual a um dado*; você sabe que os números podem se repetir.
O que você pode fazer é preencher um array com os números de 1 a N, e ir trocando a posição [i] do array com um valor na posição de [0] a [N - 1], tal como a função shuffle (veja o fonte da java.util.Arrays, método shuffle) faz.
Um dado (dice) que tem as faces numeradas de 1 a 6, não um dado (data).
Só que em vez de voltar um número de 1 a 6, Math.random retorna um número de ponto flutuante de 0.0 a 1.0, excluindo o 1.0.
Zakim
conforme sua explicação, eu entendi que vc precisa que os dados sorteados não se repitam, dpois que eles ja forem sorteado certo?
Voce esta puchando esses dados para o sorteio do banco de dados?
caso não estiver, tente acumular o valor dos resultados ja sorteados em uma lista dinamica (ArrayList) e dpois faça a comparação para ver se não é repitido.
Ao invés de ficar embaralhando toda vez! embaralhe uma vez só e faça esse tipo de tratamento que fica mais bacana!
espero que tenha ajudado!
Tem um patterns que fala sobre isso!
o estado do seu objeto!
nadilsons
Por que você não usa um HashSet ao invés de um vetor?
LPJava
use uma das classes que implementa a interface Set de Collection. A unica maneira de nao ter elementos duplicados…mais outra dica dar uma lida nesse topico aqui é fundamental para o guj: http://www.guj.com.br/posts/list/50115.java
sergiotaborda
Supondo que vc quer sortear um numero inteiro entre 1 e N
eis uma forma simples
publicQueue<Integer>preencheParaSorteio(intnumeroDeElementos){List<Integer>list=newArrayList<Integer>();for(inti=1;i<=numeroDeElementos;i++){// preenche a lista na ordemlist.add(i);}// baralha os elementosCollections.shuffle(list);// retorna a queue mais simplesreturnnewLinkedList<Integer>(list);}
O modo de uso é simples por causa da interface Queue
Queue<Integer>fila=preencheParaSorteio(10);// 10 elementos// obtém proximo numero // retorna o primeiro elemento da fila,// simultaneamente, removendo-o da fila Integern=file.poll();if(n==null){// a fila não tem mais elementos. // já foram usados todos}// usa n para alguma coisaSystem.out.println(n);
Poderia retornar um List e usar get(0) , só que essa opção envolve remover o elemento explicitamente depois de o obter com get()
Isso é desnecessário já que a interface Queue tem um método exatamente para fazer isso. Além disso , Queue , deixa claro que se trata de uma fila e não uma lista qualquer.
[size=8]Nota: Alguém pode ter curiosidade de porque é usado um ArrayList e depois convertido para um LinkedList. A razão de não usar o LinkedList de um inicio é que o javadoc de Collections.suffle() afirma que se a lista não implementar RandomAccess (como ArrayList) ela será convertida para uma e depois reconvertida. Então, por simplicidade usa o ArrayList primeiro para facilitar o suffle e depois retorna LinkedList porque é a Queue mais simples que tem. Contudo outras poderiam ser retornadas se necessário.[/size]