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