Aleatorio sem repetição

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!

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 + " ");
		}
	}
}

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é!

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?

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

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

Até!

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…

[code]
import java.util.ArrayList;
import java.util.Random;

public class Euromilion {
private ArrayList Allnumbers;
private ArrayList 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;
}

}[/code]

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);
		}
	}

}

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:

[code]//Criamos um random e um set
Random random = new Random();
Set numeros = new TreeSet();

//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);
}
[/code]

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:

[code]//Preenchemos o list com os números
List numeros = new List();

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);
}
[/code]

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

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

Até!

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.

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

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();
	}
}