GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Algoritmo de LotoFacil problema

Ola pessoal… cabei de fazer o curso da linguagem java na sun… só que como é mt corrido eles passam bastante teoria…
ai mt coisa eu fico meio perdido…
bom tentei faze um algoritmo pra cria jogos da LotoFacil só que nao sei que ta dando, eu faco as verificacoes pra nao repeti os numero nem por mais msm assim ele ta fazendo…

classe Main

[code]public class Main {
public static void main(String[] args) {
GeraResultado jogos = new GeraResultado();
jogos.gerador();
}

}[/code]

classe GeraResultado

[code]public class GeraResultado {

private int[] numeros = new int[15];
public GeraResultado()
{
    gerador();
}
public void gerador()
{
    for(int i=0; i != 15;)
    {
        
        int numeroRand = (int)(Math.random()*100);
        if(numeroRand <= 25 && numeroRand > 0 )
        { 
               i++;
               int controle = 0;
               int count = 0;
               do {
                   count++;
                   if(numeroRand == numeros[count-1])//controle para verificar se o numero nao repete
                      controle++;
                      
               } while (count != i);
               if(controle == 0)
               {
                   numeros[i-1] = (int)numeroRand;
               }
        }      
    }
    System.out.println("---- JOGO PRONTO ----");
    for(int i=0; i!= 15; i++)
    {
        System.out.println(numeros[i]);//printa os numeros que estao armazenados no array
    }
}

}[/code]

O metodo “gerador” esta sendo chamado duas vezes
no contrutor e na chamada.
tenta tirar o do construtor.

jogos.gerador();

[quote]
public GeraResultado()
{

}[/quote]

[quote=sedmalakian]O metodo “gerador” esta sendo chamado duas vezes
no contrutor e na chamada.
tenta tirar o do construtor.

jogos.gerador();

[quote]
public GeraResultado()
{

}[/quote][/quote]

sim, bem observado vlw… mais os problemas ainda continuam ta printando “JOGO PRONTO” do for e nao sei pq diabos mais ta gravando numeros repetido e 0 no array…

oi

para você gerar um número aleatório entre 0 e 25 precisa fazer

int numeroRand = (int) (Math.random()*26);

tente adicionar em um ArrayList ao invés de um vetor de int, assim você pode usar o método indexOf para checar se o elemento já foi adicionado a lista…

abs

[quote=André Fonseca]oi

para você gerar um número aleatório entre 0 e 25 precisa fazer

int numeroRand = (int) (Math.random()*26);

tente adicionar em um ArrayList ao invés de um vetor de int, assim você pode usar o método indexOf para checar se o elemento já foi adicionado a lista…

abs[/quote]

No entanto, ele precisa gerar numeros de 1 a 25

int numeroRand = ((int) (Math.random()*25)) + 1;  

brinquei tb de fazer um algoritmo de fazer jogos da lotofacil, o meu algoritmo ficou assim:

Metodo gerador

//criei o globo da lotomania
		List<Integer> globo = new ArrayList<Integer>();
		//adiciono as bolas no globo, da bola numero 1 ate a numero 25
		for(int i=1;i<=25;i++){
			globo.add(new Integer(i));
		}
		//crio o local onde as bolas sorteadas ficaram
		List<Integer> numerosSortedos = new ArrayList<Integer>();
		//sorteio as bolas e paro quando atingir o numero de 15 bolas sorteadas
		while(numerosSortedos.size() < 15){
			
			int indiceSorteado = (int)(Math.random()*globo.size());  
			numerosSortedos.add(globo.get(indiceSorteado));
			//tira do globo a bola sorteada
			globo.remove(indiceSorteado);
		}
		System.out.println(numerosSortedos);

vou dar uma analisada melhor no seu codigo para saber pq seu jogo esta vindo com numeros repetidas

(comentario sobre a causa do problema abaixo do codigo)
SOLUÇÃO PARA O PROBLEMA DE REPETIÇÃO DO NUMERO 0:

for(int i=0; i != 15;)  
		         {  
		               
		             int numeroRand = ((int)(Math.random()*25))+1;  
		             
		             //morreu o if estou sorteando bolas no intervalo de 1 a 25
		             //if(numeroRand <= 25 && numeroRand > 0 )  
		             //{   
		                    i++;  
		                    int controle = 0;  
		                    int count = 0;  
		                    do {  
		                        count++;
		                        
		                        if(numeroRand == numeros[count-1]){//controle para verificar se o numero nao repete  
		                           controle++;
		                           //SOLUÇÃO PARA O PROBLEMA DE REPETIÇÃO DO NUMERO 0
		                           i--;
		                        }     
		                    } while (count != i);
		                    
		                    if(controle == 0)  
		                    {  
		                        numeros[i-1] = (int)numeroRand;  
		                    }  
		            //}        
		         }  
		         System.out.println("---- JOGO PRONTO ----");  
		         for(int i=0; i!= 15; i++)  
			         {  
			             System.out.println(numeros[i]);//printa os numeros que estao armazenados no array  
			         }  
			     }

Por que estava repetindo o numero 0?
pois quando vc cria um array estatico de inteiros (int[] numeros = new int[15]) vc está criando um array com 15 elementos 0…

Array comeca assim: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
ai quando saia um numero repetido, vc nao populava o indice deixando o valor 0.
o i-- no if de verificacao, fez com q caso o numero se repetisse ele permaneça no mesmo indice, e nao passe para o proximo como estava acontecendo

OBS.: sou pessimo em explicacoes espero que tenha entendido

Att. Dirceu

entendi sim…
valeu pela resposta dos dois… vo estudar melhor essa classe arrayList…
abracos!

uma solução para vc sortear bolas sem reposição… é vc colocar todas as suas bolas dentro de uma ArrayList… e usar list.remove() … para remover as bolas… assim garante 100% que não havera repetições… por exemplo

[code] public static void main(String[] args) {
int numeroDeBolasNaUrna = 25;
int numeroDeBolasASortear = 15;
Random roleta = new Random();
List urna = new ArrayList(numeroDeBolasNaUrna);
int[] resultados = new int[numeroDeBolasASortear];

	for (int i = 0; i < numeroDeBolasNaUrna; i++) 
		urna.add(i+1); //adciona 1 pois as bolas na urna iniciam de 1 e não de 0
	
	for (int i = 0; i < numeroDeBolasASortear; i++)
		//pega uma bola aleatorea da urna (atraves da roleta), e a retirna
		resultados[i] = urna.remove(roleta.nextInt(urna.size()));
	
	//imprimindo resultado
	for (int resultado : resultados)
		System.out.print(resultado + " ");
}[/code]

resultado no 1° giro
10 5 24 16 11 2 8 25 14 19 7 13 21 17 9

resultado no 2° giro
25 12 6 11 16 20 23 3 22 10 18 13 7 8 21

Separei em métodos em partes

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

public class Urna {
/**
* Sorteia aleatoriamente as bolas da urna sem reposição, sendo a lista urna, sera
* alterada e ao final da operação ficará sem suas bolas.
* @param urna contem as bolas a serem sorteadas.
* @param numeroDeBolasASortear número de bolas a sortear
* @return o resultado do sorteio.
* @throws IllegalArgumentException Quando algum argumento é Illegal, por exemplo
* quando numeroDeBolasASortear é maior que a quantidade de bolas na urna,
* ou quando numeroDeBolasASortear ou tamanho da urna é igual a zero.
*/
public static int[] sorteiSemReposição(List urna,
int numeroDeBolasASortear) throws IllegalArgumentException {

	if (numeroDeBolasASortear > urna.size()) 
		throw new IllegalArgumentException("Quantidade de bolas a sortear maior que o número de bolas na urna");
	if (numeroDeBolasASortear == 0) 
		throw new IllegalArgumentException("Quantidade de bolas a sortear não pode ser zero");
	if (urna.size() == 0)
		throw new IllegalArgumentException("A urna não pode estar vazia");
	
	int[] resultados = new int[numeroDeBolasASortear];
	Random roleta = new Random();
	for (int i = 0; i < numeroDeBolasASortear; i++)
		//pega uma bola aleatorea da urna (atraves da roleta), e a retirna
		resultados[i] = urna.remove(roleta.nextInt(urna.size()));
	return resultados;
}

/**
 * Cria uma urna contendo o número de bolas enviadas, que inicia do número 1.
 * @param numeroDeBolasNaUrna número de bolas que a urna contem.
 * @return a urna pronta.
 */
public static List<Integer> createUrna(int numeroDeBolasNaUrna) {
	return createUrna(numeroDeBolasNaUrna,1);
}

/**
 * Cria uma urna contendo o número de bolas enviadas, que inicia do número numeroIncial.
 * @param numeroDeBolasNaUrna número de bolas que a urna contem. 
 * @param numeroIncial número inicial da bola da urna.
 * @return
 */
public static List<Integer> createUrna(int numeroDeBolasNaUrna,int numeroIncial) {
	List<Integer> urna = new ArrayList<Integer>(numeroDeBolasNaUrna);
	for (int i = 0; i < numeroDeBolasNaUrna; i++) 
		urna.add(i+numeroIncial);
	return urna;
}

}[/code]

uma abordagem simples

public static void main(String[] args) { for (int resultado : Urna.sorteiSemReposição(Urna.createUrna(25),15)) System.out.print(resultado + " | "); }
o resultado foi

7 | 8 | 5 | 3 | 23 | 14 | 19 | 4 | 17 | 9 | 20 | 10 | 11 | 16 | 12 |

fazendo um sorteio + elaborado

	public static void main(String[] args) {
		List<Integer> urna = Urna.createUrna(25);
		
		int[] resultados;
		
		//retirar 15 bolas e imprimir
		{
			System.out.print("Retira 15 bolas: | ");
			resultados = Urna.sorteiSemReposição(urna,15);
			//imprimindo resultado
			for (int resultado : resultados)
				if (resultado < 10)
					System.out.print(" "+ resultado + " | ");
				else
					System.out.print(resultado + " | ");
			System.out.println(); //apenas para dar um espaço
		}
		
		//retirar +5 bolas e imprimir
		{
			System.out.print("Retira +5 bolas: | ");
			resultados = Urna.sorteiSemReposição(urna,5);
			//imprimindo resultado
			for (int resultado : resultados)
				if (resultado < 10)
					System.out.print(" "+ resultado + " | ");
				else
					System.out.print(resultado + " | ");
			System.out.println(); //apenas para dar um espaço
		}
		
		//imprimir as bolas que sobraram
		{
			System.out.print("Bolas restantes: | ");
			for (int bolas : urna)
				if (bolas < 10)
					System.out.print(" "+ bolas + " | ");
				else
					System.out.print(bolas + " | ");
		}
	}

o resultado foi

Retira 15 bolas: | 24 | 12 | 21 | 16 | 19 | 20 | 13 | 3 | 17 | 5 | 25 | 6 | 10 | 15 | 7 | Retira +5 bolas: | 1 | 4 | 14 | 18 | 2 | Bolas restantes: | 8 | 9 | 11 | 22 | 23 |

[quote=Lavieri]Separei em métodos em partes

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

public class Urna {
/**
* Sorteia aleatoriamente as bolas da urna sem reposição, sendo a lista urna, sera
* alterada e ao final da operação ficará sem suas bolas.
* @param urna contem as bolas a serem sorteadas.
* @param numeroDeBolasASortear número de bolas a sortear
* @return o resultado do sorteio.
* @throws IllegalArgumentException Quando algum argumento é Illegal, por exemplo
* quando numeroDeBolasASortear é maior que a quantidade de bolas na urna,
* ou quando numeroDeBolasASortear ou tamanho da urna é igual a zero.
*/
public static int[] sorteiSemReposição(List urna,
int numeroDeBolasASortear) throws IllegalArgumentException {

	if (numeroDeBolasASortear > urna.size()) 
		throw new IllegalArgumentException("Quantidade de bolas a sortear maior que o número de bolas na urna");
	if (numeroDeBolasASortear == 0) 
		throw new IllegalArgumentException("Quantidade de bolas a sortear não pode ser zero");
	if (urna.size() == 0)
		throw new IllegalArgumentException("A urna não pode estar vazia");
	
	int[] resultados = new int[numeroDeBolasASortear];
	Random roleta = new Random();
	for (int i = 0; i < numeroDeBolasASortear; i++)
		//pega uma bola aleatorea da urna (atraves da roleta), e a retirna
		resultados[i] = urna.remove(roleta.nextInt(urna.size()));
	return resultados;
}

/**
 * Cria uma urna contendo o número de bolas enviadas, que inicia do número 1.
 * @param numeroDeBolasNaUrna número de bolas que a urna contem.
 * @return a urna pronta.
 */
public static List<Integer> createUrna(int numeroDeBolasNaUrna) {
	return createUrna(numeroDeBolasNaUrna,1);
}

/**
 * Cria uma urna contendo o número de bolas enviadas, que inicia do número numeroIncial.
 * @param numeroDeBolasNaUrna número de bolas que a urna contem. 
 * @param numeroIncial número inicial da bola da urna.
 * @return
 */
public static List<Integer> createUrna(int numeroDeBolasNaUrna,int numeroIncial) {
	List<Integer> urna = new ArrayList<Integer>(numeroDeBolasNaUrna);
	for (int i = 0; i < numeroDeBolasNaUrna; i++) 
		urna.add(i+numeroIncial);
	return urna;
}

}[/code]

uma abordagem simples

public static void main(String[] args) { for (int resultado : Urna.sorteiSemReposição(Urna.createUrna(25),15)) System.out.print(resultado + " | "); }
o resultado foi

7 | 8 | 5 | 3 | 23 | 14 | 19 | 4 | 17 | 9 | 20 | 10 | 11 | 16 | 12 |

fazendo um sorteio + elaborado

	public static void main(String[] args) {
		List<Integer> urna = Urna.createUrna(25);
		
		int[] resultados;
		
		//retirar 15 bolas e imprimir
		{
			System.out.print("Retira 15 bolas: | ");
			resultados = Urna.sorteiSemReposição(urna,15);
			//imprimindo resultado
			for (int resultado : resultados)
				if (resultado < 10)
					System.out.print(" "+ resultado + " | ");
				else
					System.out.print(resultado + " | ");
			System.out.println(); //apenas para dar um espaço
		}
		
		//retirar +5 bolas e imprimir
		{
			System.out.print("Retira +5 bolas: | ");
			resultados = Urna.sorteiSemReposição(urna,5);
			//imprimindo resultado
			for (int resultado : resultados)
				if (resultado < 10)
					System.out.print(" "+ resultado + " | ");
				else
					System.out.print(resultado + " | ");
			System.out.println(); //apenas para dar um espaço
		}
		
		//imprimir as bolas que sobraram
		{
			System.out.print("Bolas restantes: | ");
			for (int bolas : urna)
				if (bolas < 10)
					System.out.print(" "+ bolas + " | ");
				else
					System.out.print(bolas + " | ");
		}
	}

o resultado foi

Retira 15 bolas: | 24 | 12 | 21 | 16 | 19 | 20 | 13 | 3 | 17 | 5 | 25 | 6 | 10 | 15 | 7 | Retira +5 bolas: | 1 | 4 | 14 | 18 | 2 | Bolas restantes: | 8 | 9 | 11 | 22 | 23 |

[/quote]

muito loco veio… só me explica por favor q q 2 coisas que fiquei com duvida, que que essa pagina 30 faiz ( resultados[i] = urna.remove(roleta.nextInt(urna.size())); ), e esses <Integer>(isso é aquele negocio de classe Wrapper?)…
vlw abracos!!

A notação refere-se a Generics. Wrappers são classes que encapsulam em objetos os tipos primitivos (Character, Integer, Double, Long, Byte, Short, Boolean e Float).

Ou seja, a notação com os sinais < e > são Generics e a classe Integer é Wrapper.

[quote=marcobiscaro2112]A notação refere-se a Generics. Wrappers são classes que encapsulam em objetos os tipos primitivos (Character, Integer, Double, Long, Byte, Short, Boolean e Float).

Ou seja, a notação com os sinais < e > são Generics e a classe Integer é Wrapper.[/quote]

hmm valeu… e deixo faze outra pergunta porque:
List urna = new ArrayList(numeroDeBolasNaUrna); e nao
ArrayList urna = new ArrayList(numeroDeBolasNaUrna); ??(isso é poliformismo né?)

[quote=SpoomaN][quote=marcobiscaro2112]A notação refere-se a Generics. Wrappers são classes que encapsulam em objetos os tipos primitivos (Character, Integer, Double, Long, Byte, Short, Boolean e Float).

Ou seja, a notação com os sinais < e > são Generics e a classe Integer é Wrapper.[/quote]

hmm valeu… e deixo faze outra pergunta porque:
List urna = new ArrayList(numeroDeBolasNaUrna); e nao
ArrayList urna = new ArrayList(numeroDeBolasNaUrna); ??(isso é poliformismo né?)[/quote]

Exato! Posso me referir a um ArrayList como sendo um List, uma vez que isso sempre é verdade. Já o contrário pode ou não ser verdade.

Não testei… mas aí vai

[code]
public void roda() {

	List<Integer> resultado = new ArrayList<Integer>(15);
	Urna urna = new Urna();
	
	for ( int i = 0 ; i < 15 ; i++) {
		resultado.add(urna.sorteia());
	}
	
	Collections.sort(resultado);
	System.out.println(resultado);
}

class Urna {
	List<Integer> bolas = new ArrayList<Integer>(25);
	public Urna() {
		for ( int i = 1 ; i <=25 ; i++ ) {
			bolas.add(i);
		}
	}
	public Integer sorteia() {
		Random generator = new Random();
		int pos = generator.nextInt() * ( bolas.size() - 1 ) ;
		Integer bola = bolas.get(pos);
		bolas.remove(pos);
		return bola;
	}
	
}[/code]
//