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;
public EmbaralharNumeros (int num){
total = num;
} // Fim Construtor EmbaralharNumeros
public int sorteio (){
int r, i, j;
int teste[] = new int [total];
int result [] = new int [total];
teste[0]= 0;
result [0] = 0;
//Vou criar um vetor TESTE com tamanho de TOTAL
for (i = 0; i <= total; i ++){
teste [i] = (int) (Math.random()* total);
//Tenho que verificar se o valor nao esta repetido
for (j = 0; j <= total; j++){
while ( teste[i] == result[j]){
teste [i] = (int) (Math.random()* total);
}
result [j] = teste [i];
}//Fim fo j
}// Fim for i
for ( r = 0; r <= total; r ++) {
return result[r];
}//Fim for r
}// Fim Metodo sorteio
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.
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!
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
Supondo que vc quer sortear um numero inteiro entre 1 e N
eis uma forma simples
public Queue<Integer> preencheParaSorteio(int numeroDeElementos ){
List<Integer> list = new ArrayList<Integer>();
for (int i=1; i <=numeroDeElementos ;i++ ){
// preenche a lista na ordem
list.add(i);
}
// baralha os elementos
Collections.shuffle(list);
// retorna a queue mais simples
return new LinkedList<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
Integer n = file.poll();
if (n==null){
// a fila não tem mais elementos.
// já foram usados todos
}
// usa n para alguma coisa
System.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]