Números aleatórios

12 respostas
Rooney

Como gerar 3 números aleatórios e que nunca se repitam

12 Respostas

J
Rooney:
Como gerar 3 números aleatórios e que nunca se repitam
Cara, posso não estar ajudando, mas podes tentar usar a classe Random, e para que não se repitam podes por numa lista por exemplo, e antes de adicionar verifica se ja esta lá...
LinkedList lista = new LinkedList();  
  
int x = generator.nextInt(10);
  
if (!lista.contais(x))  
{  
   lista.add(x);  
}

Se quiser dar uma olhada aqui pra ver como funciona o Random, quem sabe não descobres o que precisas e até mais algumas coisas... :)
[url]http://java.sun.com/j2se/1.5.0/docs/api/java/util/Random.html[/url]

J

Pensando melhor, se são só 3 numeros, podes gerar 2 com o random e comparar pra ver se são iguais, se não forem gera o terceiro e compara denovo, mas se for mais que isso ja começa a ficar “feio” fazer assim…

Espero que te ajude…

kaique

Você poderia utilizar a classe Random e armazenar os valores em três variávies. Daí, sempre que for gerando os valores, checa se eles são repetidos. Se sim, basta gerar outro número e comparar novamente até que nenhum se repita…

[]'s.

M

Assim:

private static final Random RANDOM = new Random();

public static void main(String[] args) {
	// valor máximo para sortear
	int maximo = 50;
	// onde serão armazenados os valores (não se repetem)
	HashSet<Integer> numerosSorteados = new HashSet<Integer>();
	// enquanto houverem menos do que 3 elementos, adicionar mais um
	while (numerosSorteados.size() < 3) {
		numerosSorteados.add(RANDOM.nextInt(maximo));
	}
	// depois, faz o que for preciso com o vetor
	System.out.println(numerosSorteados);
}
ViniGodoy

Se forem números dentro de um subset, como uma os os 6 números entre os 60 da sena, você pode usar o método Collections.shuffle:

//Criamos a lista dos números possíveis
List<Integer> possibilidades = new ArrayList<Integer>();
for (int = 1; i <= 60; i++) {
   possibilidades.add(i);
}

//Embaralhamos a lista
Collections.shuffle(possibilidades);

//Retornamos os 6 primeiros elementos
List<Integer> sorteados = new ArrayList<Integer>();
for (int i = 0; i < 6; i++) {
   sorteados.add(possibilidades.get(i));
}
Foxlol

Um exemplo “a lá” megasena:

Set<Integer> numerosSorteados = new TreeSet<Integer>();

while (numerosSorteados.size() < 3) {
   Integer numeroSorteado = Double.valueOf((Math.random() * 60) + 1).intValue();

   numerosSorteados.add(numeroSorteado);
}
bestlinux

Galera ta usando o Set, mas não sei se o criador do topico sabe, mas o motivo pelo qual estão usando, é que o Set não aceita números repetidos.

Rooney

Ow to vendo q as respostas estão fluino veja bem, tentei fazer da forma q todos vcs falram, mas o numero se repete tbm, tentei usar o relogio do PC, porém ele gera um numero muito alto, e eu errei são 4 número q não podem se repetir, tem como usar o metodo q usar o relogio do pc q gere entre 0 e 20?

:-o

Foxlol

Rooney:
Ow to vendo q as respostas estão fluino veja bem, tentei fazer da forma q todos vcs falram, mas o numero se repete tbm, tentei usar o relogio do PC, porém ele gera um numero muito alto, e eu errei são 4 número q não podem se repetir, tem como usar o metodo q usar o relogio do pc q gere entre 0 e 20?

:-o

//Variável de instância da classe que vai conter todos  sorteados
Set<Integer> numerosJaSorteados = new TreeSet<Integer>();

//Variável local do método que vai conter o sorteio atual
Set<Integer> numerosSorteados = new TreeSet<Integer>();

//Se  alcançou a capacidade máxima não faz nada
if (numerosJaSorteados.size() == 20) {
   return;
}

//Enquanto não sortear 4 números
while (numerosSorteados.size() < 4) {

   //Realiza o sorteio
   Integer numeroSorteado = Double.valueOf(Math.random() * 20).intValue();
   
   //Verifique se  foi sorteado alguma vez
   if (!numerosJaSorteados.contains(numeroSorteado) {
      numerosSorteados.add(numeroSorteado);
   }
}

//Faz o que vc quiser com os número sorteados atuais

//Armazena os números sorteados na variável de instância da classe
numerosJaSorteados.addAll(numerosSorteados);

Do modo acima não vai se repetir enquanto existir a instância da classe. Mas se vc precisar de um mecanismo persistência já teria que utilizar arquivo ou banco de dados.

Flw.

M
marcobiscaro2112:
Assim:
private static final Random RANDOM = new Random();

public static void main(String[] args) {
	// valor máximo para sortear
	int maximo = 50;
	// onde serão armazenados os valores (não se repetem)
	HashSet<Integer> numerosSorteados = new HashSet<Integer>();
	// enquanto houverem menos do que 3 elementos, adicionar mais um
	while (numerosSorteados.size() < 3) {
		numerosSorteados.add(RANDOM.nextInt(maximo));
	}
	// depois, faz o que for preciso com o vetor
	System.out.println(numerosSorteados);
}
É só trocar o valor máximo de 50 para 20 e a quantidade de números de 3 para 4.
B

Se o conjunto for pequeno, por exemplo números da mega sena, você pode também incluir todos 60 números dentro de qualquer coleção, e a cada número retirado, você o elimina da coleção. A implementação é bem simples.

pedroroxd

É lógico que o do vinny da certo -.-

import java.util.Collections;
import java.util.List;

public class lalalalala {
	public static void main(String[] args) {
		 List<Integer> possibilidades = new ArrayList<Integer>();  
		 for (int i= 1; i <= 60; i++) {  
		    possibilidades.add(i);  
		 }  
		 //Embaralhamos a lista  
		 Collections.shuffle(possibilidades);  
		 
		 //Retornamos os 6 primeiros elementos  
		 List<Integer> sorteados = new ArrayList<Integer>();  
		 for (int i = 0; i < 6; i++) {  
		    sorteados.add(possibilidades.get(i));  
		 }	 
		 System.out.println(sorteados);
	}
}
Você está criando 1 lista de números.. de 1 a 60, depois vc embaralha ela e pega os 6 primeiros... Não tem como dar repetido.. Alguém sabe como que é o da loteria? É assim msmo? Ou ta mais pro do Foxlol? :P
Criado 10 de dezembro de 2009
Ultima resposta 11 de dez. de 2009
Respostas 12
Participantes 9