Numeros sem repetição RANDON

5 respostas
F

pessoal estou gerando numeros aleatorios mas nao quero que os numeros se repitam e como se fosse um bingo eu gero numeros e mando por emails mas nao queria que no emails em uma sessao fosse numeros iguais, tentei armazer em um list mas sem sucesso alguém pode me ajudar?

como estou gerando o numeros aleatorios:

Random r1;
			 r1 = new Random();
			 int numero = (int)(r1.nextDouble() * 100);

5 Respostas

furutani

Utilize uma classe Set para armazenar os números sorteados.

F

você teria um exemplo disso?

ViniGodoy

Cuidado. Essa classe trava se todos os números possíveis no range máximo forem sorteados.
Mas o princípio básico está aí.

public class NotSoRandom {
   private Random random = new Random();
   private Set<Integer> sorted = new HashSet<Integer>();

   public int nextInt(int range) {
      int number = random.nextInt(range);
      while (sorted.contains(number) {
         number = random.nextInt(range);         
      }
      sorted.add(number);
      return number;
   }

   public void clear() {
      sorted.clear();
   }
}
ViniGodoy

Uma outra forma, é vc gerar uma lista com vários números:

public List<Integer> numbers = new List<Integer>();

for (int i = 0; i < 100; i++)
  numbers.add(i);
E depois embaralha-los com o método Collections.suffle:
Collections.suffle(numbers);

Depois é só ir retirando o último elemento da lista...

cassio

Esse algorítmo permite que você sorteie os números sem repetição e sem precisar de um Set, apenas de um array. A vantagem de utilizar esse algorítmo é que você não precisa ficar fazendo lookup no Set para ver se o número já foi sorteado.

int qtdeNumeros = 1000; //qtde de numeros q vc vai sortear
int[ ] posicoesRand = new int[qtdeNumeros]; //guarda os numeros sorteados.
Random randGen = new Random();
//inicializa o array
for(int i = 0; i < qtdeNumeros; i++) posicoesRand[i] = i;
//sorteia sem repeticoes
int temp, randomPosition;
for(int i = 0; i < qtdeNumeros; i++){
   randomPosition = randGen.nextInt(qtdeNumeros - 1);
   temp = posicoesRand[i];
   posicoesRand[i] = posicoesRand[randomPosition];
   posicoesRand[randomPosition] = temp;
}
Criado 5 de março de 2008
Ultima resposta 6 de mar. de 2008
Respostas 5
Participantes 4