Aleatorio sem repetição

11 respostas
S

Ola pessoal!

Fiz este programinha para gerar 15 numeros aleatorios dentre 25.

public class Loteria
{

public static void main(String[] args)
{
	int valor;  
   	int vetor[] = new int[15];  
    byte i;
    byte i1;
	   
       for ( i = 0; i < 15 ; i++)
       {  
          
    	  valor = 1 + (int) (Math.random()*25);  
    	  
          for (i1=0; i1< i; i1++ )  
        	  
            if (vetor[i1] != valor)
            {  
                vetor[i] = valor;  
                
             }           
          System.out.print (vetor[i] + " ");
	       
       }  
}

}


A QUESTÃO:
Como faço para nao repetir numeros???

valeu povo!!

Deus os Abençoe!

11 Respostas

G

Uma idéia para a solução do problema.
Se você puder usar uma List, ela contém um método chamado contains, onde você pode verificar se
um determinado valor já existe dentro dessa List.

Por Exemplo:

public class App {

	public static void main(String[] args) {
		List<Integer> lista = new ArrayList<Integer>();
		Integer valor;

		// enquanto a lista n tiver os 15 números
		while(lista.size() < 16) {
			valor = 1 + (int) (Math.random() * 25);
			// se o número for distinto
			if(!lista.contains(valor)) {
				lista.add(valor);
			}
		}
		
		// mostrando o resultado
		for(Integer n : lista) {
			System.out.print(n + " ");
		}
	}
}
maquiavelbona

Outra solução seria usar a API que ela disponibiliza. Você poderia criar uma lista com os valores possíveis e ir usando o Collections.shuffle() e List.remove(). Mas se isso for o trabalho de alguma faculdade ou curso, não recomendo essa abordagem pois eles querem que você faça isso na mão.

Até!

S

Mesmo assim nao consegui sair do lugar.

Eu sou novato em java. Comecei a aprender este ano na faculdade.

Eu nao consegui entender o da lista.

na parte do List < integer> lista = new Arraylist ();

ele tah dando algum erro. Ja tentei importar a utilidade e tudo mais.

O que eu faço?

maquiavelbona

Se você declara o tipo num lado, no outro também tem que estar declarado:

List<Integer> lista = new ArrayList<Integer>();

Até!

Alkamavo

Boas parceiro
em tempos fiz este programinha, a abordagem é a mesma mas fiz ela para a lotaria da europa que é o Euromilhoes, sao 50 numeros e pode se escolher 5 e 2 estrelas..
Tu depois adaptas para a tua questao..

import java.util.ArrayList;
import java.util.Random;

public class Euromilion {
	private ArrayList<Integer> Allnumbers;
	private ArrayList<Integer> Estrelas;
	private Random Rand;

	public Euromilion(ArrayList<Integer> allnumbers,
			ArrayList<Integer> estrelas, Random rand) {
		super();
		Allnumbers = new ArrayList<Integer>(50);
		;
		Estrelas = new ArrayList<Integer>(10);
		Rand = new Random();
	}

	public Euromilion() {
		Allnumbers = new ArrayList<Integer>(50);
		Estrelas = new ArrayList<Integer>(10);
		Rand = new Random();
	}

	public ArrayList<Integer> getAllnumbers() {
		return Allnumbers;
	}

	public void setAllnumbers(ArrayList<Integer> allnumbers) {
		Allnumbers = allnumbers;
	}

	public ArrayList<Integer> getEstrelas() {
		return Estrelas;
	}

	public void setEstrelas(ArrayList<Integer> estrelas) {
		Estrelas = estrelas;
	}

	public Random getRand() {
		return Rand;
	}

	public void setRand(Random rand) {
		Rand = rand;
	}

	public void FillAllnumbers() {

		for (int i = 1; i < 51; i++) {
			this.Allnumbers.add(i);
		}
	}

	public void FillEstrelas() {
		for (int i = 1; i < 10; i++) {
			this.Estrelas.add(i);

		}
	}

	public ArrayList<Integer> CalculaNumbers() {
		// int numero = Rand.nextInt(50);
		ArrayList<Integer> result_number = new ArrayList<Integer>(5);
		int contador = 0;
		int xpto = 0;
		while (contador < 5) {
			int numero = Rand.nextInt(50);
			xpto = Allnumbers.get(numero);
			if (!(result_number.contains(xpto))) {
				result_number.add(xpto);
				contador++;
			}


		}
		return result_number;
	}

	public ArrayList<Integer> CalculaEstrelas() {

		ArrayList<Integer> result = new ArrayList<Integer>(2);
		int contador = 0;
		while (contador < 2) {
			int numero = Rand.nextInt(9);
			int xpto = Estrelas.get(numero);
			if (!(result.contains(xpto)))
				result.add(xpto);
			contador++;

		}
		return result;

	}

	public String toString() {
		String numeros = null;
		String Estrelinhas = null;

		for (int i : Allnumbers) {
			numeros = "Numeros :" + i + ",";
		}
		for (int x : Estrelas) {
			Estrelinhas = "Stars :" + x + ",";
		}
		return numeros + Estrelinhas;
	}
}

e a classe main

import java.util.ArrayList;
import java.util.Random;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ArrayList<Integer> Calc_numeros;
		ArrayList<Integer> Cal_Stars;

		ArrayList<Integer> numeros = null;
		ArrayList<Integer> Stars = null;
		Random xpto = new Random();

		Euromilion E = new Euromilion(numeros, Stars, xpto);
		E.FillAllnumbers();
		E.FillEstrelas();
		Cal_Stars = E.CalculaEstrelas();
		Calc_numeros = E.CalculaNumbers();
		


		System.out.println("Numeros :");
		for (int i : Calc_numeros) {
			System.out.printf("%d ", i);

		}
		System.out.println();
		System.out.println("Estrelas :");
		for (int x : Cal_Stars) {
			System.out.printf("%d ", x);
		}
	}

}
ViniGodoy

Usar o contains do list é uma péssima idéia. A performance dele é simplesmente desprezível.
Quando o assunto é não ter repetição, você deve utilizar um set. O set naturalmente abandona a repetição.

Além disso, para gerar números aleatórios, use a classe Random. Do jeito que você fez, as chances de se sortear o número 25 são muito menores do que a de qualquer outro número da série. Não é muito justo, concorda?

Olha aqui uma possível solução para o seu problema:

//Criamos um random e um set
Random random = new Random();
Set<Integer> numeros = new TreeSet<Integer>();

//Fazemos o sorteio dos 15 números.
while (numeros.size() < 15) {
    numeros.add(random.nextInt(25)+1);
}

//Imprimimos o resultado.
for (Integer numero : numeros) {
   System.out.println(numero);
}

Outra forma é fazer como a sena faz. Aí sim, usando um List. Você pode colocar os 25 números na lista e sortear os índices. O que for sorteado, você copia para o vetor de números.

Veja:

//Preenchemos o list com os números
List<Integer> numeros = new List<Integer>();

for (int i = 1; i <= 25; i++)
   numeros.add(i);

//Sorteamos 15 índices
int[] numeros = new int[15];
Random random = new Random();
for (int i = 0; i < 15; i++) {
   int indice = random.nextInt(list.size());
  
   numeros[i] = list.get(i);  //Pegamos o número do índice sorteado
   list.remove(i); //Removemos o índice sorteado.
}

//Imprimimos o resultado
for (int numero : numeros) {
    System.out.println(numero);
}
L

cara você pode fazer o seguinte pecorrer o vetor todo e verificar se o numero ja existe.

maquiavelbona

Isso é ineficiente. Se você puder garantir ordem, faça uma busca binária que no mínimo é beeeeeeeem mais eficiente.

Até!

L

claro que se poder ser ordenado seria muito mais eficiente usar uma busca binaria…mas como o cara ta no começo do curso talvez ele não saiba busca binaria…não sei isso seria uma suposição. tbm como o cara afirmou que esta no começo do curso sunho que le não saiba usar lista. Por isso a aminha sugestão de usar uma busca linear.

ViniGodoy

É exatamente o que o contains, que eu critiquei ali em cima, faz.

gpd38

Blz gente.

Com relação a este programinha de loteria, eu fiz um um tempo atras e usei com arquivo.
Gerava os numeros e gravava em um txt, por exemplo.
Tambem tinha a opcao de mostrar na tela para o usuario.
Neste programa, usei o ArrayList de java para poder manipular as repetiçoes dos numeros aleatorios.

Faça bom uso.

Vou posta-lo aqui. Dê uma olhada e se nao entender alguma parte do programa, pode me perguntar.

//Programa teste
import javax.swing.JOptionPane;

public class Teste {

	public static void main(String[] args) throws Exception {

		LotoFacil f;

		System.out.println("LOTO FACIL");
		int quantidade = Integer.parseInt(JOptionPane.showInputDialog("Escolha a quantidade de jogos a serem gerados"));
		f = new LotoFacil();		
		f.GeraValores(quantidade);
		f.MostrarValoresGerados();

	}

}
//programa Loto-"LOTERIA"
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

public class LotoFacil {

	List<Integer> lista = new ArrayList<Integer>();
	BufferedWriter loto;

	LotoFacil() throws Exception {
		String nome = JOptionPane
				.showInputDialog("Digite o nome do arquivo de gravação.\nExemplo: loto.txt");
		loto = new BufferedWriter(new FileWriter(nome));
	}

	public void GeraValores(int quantidade) throws Exception {

		for (int i = 0; i < quantidade; i++) {
			loto.write("JOGO " + (i + 1) + "  =");

			for (int j = 0; j < 15; j++) {
				int r = (int) (1 + (Math.random() * 25));

				while (lista.contains(r))
					r = (int) (1 + (Math.random() * 25));

				lista.add(r);
				loto.write(" " + r);
			}
			lista.removeAll(lista);

			loto.write("\n");
		}
		loto.close();
		JOptionPane.showMessageDialog(null, " Jogos gravados com sucesso! ");
	}

	public void MostrarValoresGerados() throws Exception {

		String nome = JOptionPane
				.showInputDialog("Digite o nome do arquivo onde foram gravados os jogos feitos.\nExemplo: loto.txt");
		BufferedReader arquivo = new BufferedReader(new FileReader(nome));
		String linha = arquivo.readLine();

		while (linha != null) {
			System.out.println(linha);
			linha = arquivo.readLine();
		}
		arquivo.close();
	}
}
Criado 24 de maio de 2008
Ultima resposta 25 de mai. de 2008
Respostas 11
Participantes 7