Classe para apresentar um vetor com números aleatórios sem repetiçoes

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	

}// Fim da classe EmbaralharNumeros

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!

Por que você não usa um HashSet ao invés de um vetor?

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]