Sorteio

21 respostas
denisspitfire

Pessoal, me ajudem pls. Estou com problemas para achar o do porque ele bagunça os valores na hora de colocar no vetor pois ele imprime só um numero sorteado e varias vezes…
O programa precisa fazer o seguinte, sortear um numero e verificar se ja foi sorteado, se nao foi ainda cadastra ele na lista… depois que terminar os ingressos ele imprime quem foi sorteado. Agradeço desde já.

import java.awt.List;
import java.util.Scanner;

class main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("Candidatos: ");
		int candidatos = scan.nextInt();
		System.out.println("Ingressos: ");
		int ingressos = scan.nextInt();
		int falta_sortear = ingressos;
		int num_sorteado,pos=0;
		int[] vetor_sorteados = new int[900];
		boolean verifica= false;
		while (falta_sortear > 0) {
			num_sorteado = (int)(Math.random() * candidatos);
			//sorteio
			for (int i = 0; i < ingressos; i++) {
				//verificação
				for (int j = 0; j < vetor_sorteados.length; j++) {
					if(num_sorteado==vetor_sorteados[j]){
						verifica=true;
						falta_sortear--;
					}
				}
				//cadastra caso verifica ainda esteja false
				if(verifica==false){
					vetor_sorteados[pos]=num_sorteado*1;
					pos++;
				}
			}
			for (int i = 0; i < pos; i++) {
				System.out.println(vetor_sorteados[i]);
			}
		}
		for (int i = 0; i < ingressos; i++) {
			System.out.println(vetor_sorteados[i] + " ");
		}
	}
}

21 Respostas

denisspitfire

eu queria fazer com pilha, verificar a pilha dai se nao tiver eu poderia dar um add do valor sorteado… seria possivel?

adriano_si

Cara, fiz algumas alterações no seu código e gostaria de sua atenção a coisas que creio que são importantes…

1 - Você criou um vetor de tamanho 900 que terá que ser percorrido a cada número sorteado… Lembre, seu vetor pode ter o tamanho exato de números a ser sorteados, você já tem esse valor exato na criação do array;

2 - O que ocorre é que você mantém esse número sorteado somente 1 vez enquanto percorre seus ingressos e lá embaixo você simplesmente decrementa o seu falta sortear, ou seja, reveja sua condição na linha 21. Você diz que se o numero sorteado já existir, você precisa sortear menos 1 número e não que aquele número não deve mais ser sorteado;

3 - use o padrão de nomenclatura Java, só conseguir trabalhar em seu código depois que alterei esse padrão, facilita a todos e é padrão, onde você pedir ajuda, vão saber lhe ajudar;

4 - cuidado com verificações boolean como flags… eu continuei as usando, mas a coisa pode ser simplificada sem elas.

Enfim, dá uma estudada nessas dicas que eu te passei e tenta resolver assim antes de fazer por pilha, vai te ajudar a evoluir a solução de forma natural…

Se não conseguir de jeito nenhum dá um grito aqui que te mostro algumas melhorias que fiz pra ver se te ajuda.

Abs []

denisspitfire

só uma coisa… vendo a pilha e as funções dela achei bem mais limpo e facil de entender… antes de ler seu tópico ja sai apagando tudo rs e acho que terminei, vou postar o código daqui a pouco

adriano_si

Hauahuahauahauahuahau beleza…

Então vou postar a atualização que fiz no seu código…

package testesjava;

import java.util.Scanner;

public class TestesJava {

    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        System.out.println("Candidatos: ");  
        int candidatos = scan.nextInt();  
        
        System.out.println("Ingressos: ");  
        int ingressos = scan.nextInt();  
        
        int faltaSortear = ingressos;  
        
        int numSorteado,pos=0;  
        
        int[] vetorSorteados = new int[ingressos];  
       
        boolean verifica= false;  
        
        while (faltaSortear > 0) {  
            for (int i = 0; i < ingressos; i++) {  
                
                numSorteado = (int)(Math.random() * candidatos); 
                //verificação  
                for (int j = 0; j < vetorSorteados.length; j++) {  
                    if(verifica = numSorteado==vetorSorteados[j])
                        break;  
                }  
                //cadastra caso verifica ainda esteja false  
                if(!verifica){  
                    vetorSorteados[pos]=numSorteado;  
                    faltaSortear--;
                    pos++;  
                }  

            }
        }  
        
        System.out.println("Ganhadores: ");
        for (int i = 0; i < ingressos; i++) {   
            System.out.print(vetorSorteados[i] + " ");  
        }  
    }
}

Com certeza usar Pilha é BEM Mais elegante… minha dica foi pra tentar resolver da forma que tinhas tentado anteriormente… quebrar a cabeça em uma solução que está empacada é bom pra mente…

enfim, que bom que resolveu.

Abs []

denisspitfire

o problema agora é que cai em um loop infinito. esqueci de alguma coisa?

import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;

class main {
	public static void main(String[] args) {
		ArrayList<Integer> pilha = new ArrayList<Integer>();
		Scanner scan = new Scanner(System.in);
		System.out.println("Candidatos: ");
		int candidatos = scan.nextInt();
		System.out.println("Ingressos: ");
		int ingressos = scan.nextInt();
		int falta_sortear = ingressos;
		int num_sorteado, pos = 0;
		int[] vetor_sorteados = new int[900];
		int tam,removido;
		boolean verifica = false;
		while (falta_sortear > 0) {
			num_sorteado = (int) (Math.random() * candidatos);
			// sorteio
			for (int i = 0; i < pilha.size(); i++) {
				if (pilha.contains(num_sorteado) == false) {
					pilha.add(num_sorteado);
				}
			}
		}
		while(pilha.size()>0){
			tam=pilha.size();
			removido=pilha.get(tam);
			System.out.println(removido);
		}
	}
}
adriano_si

Das linhas 27 - 31 você não remove o elemento da pilha, só exibe.

Enquanto ajusta isso, ajusta também as dicas que te mandei na minha primeira resposta…

Nomes de classes e variáveis e uso de booleans… esquece esses ==false e ==true

Abs []

denisspitfire

nao queria falar que nao sei exibir um elemento da pilha :frowning: entao eu removia e mostrava pela var

adriano_si

Agora que olhei com calma…

Na verdade, você está usando Listas e não Pilhas…

Como inicialmente a Lista não possui valores, o pilhas.size() sempre será == 0, logo o falta_sortear nunca será decrementado e o While executa para sempre…

Veja o que já pode ir mudando pra resolver isso.

Abs []

C
Eu sou nob ainda e tals... teria escrito um codigo de sorteio assim oh, ainda to entendendo seu código ausauuahsu.. sou iniciante é fods nem sei se faz muito sentido esse meu código... pq praticamente gera 5 numeros aleatorios de 1 a quantidade de canditos, de acordo com a quantidade de ingresos, então inves de sortear os ingresos, sorteia os canditados ganhadores dos ingresos, que axo que era totalmente ao contrario do que vc quer.
package capitulo_7;
import java.util.Scanner;
import java.util.Random;
public class Sorteio {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        Random generator = new Random();
        
        System.out.println("Candidatos: ");
        int candidatos = input.nextInt();
        System.out.println("Ingressos: ");
        int ingressos = input.nextInt();
        
        int[] vetor = new int[ingressos+1];
        
        for(int counter = 1; counter < vetor.length; counter++){ // quantidade de veses a realizar o sorteio
            for(int counter2 = 1; counter < vetor.length; counter++){ // Comparar se o numero ja saiu
                int numberLuck = 1+generator.nextInt(candidatos); 
                if(vetor[counter2] == numberLuck){
                    System.out.printf("Numero %d já sorteado!\n",vetor[counter2]);
                    counter -= 1;
                }
                if(vetor[counter2] != numberLuck){
                    vetor[counter] = numberLuck;
                }
            }
        }
        for(int i = 1; i < vetor.length; i++,){
            System.out.printf("O candidato %d ganhou\n",vetor[i]);
        }
    }
}
denisspitfire

vejam o meu resultado. vlw pela ajuda

import java.util.ArrayList;
import java.util.Scanner;

class main {
	public static void main(String[] args) {
		ArrayList<Integer> pilha = new ArrayList<Integer>();
		Scanner scan = new Scanner(System.in);
		System.out.println("Candidatos: ");
		int candidatos = scan.nextInt();
		System.out.println("Ingressos: ");
		int ingressos = scan.nextInt();
		int falta_sortear = ingressos;
		int num_sorteado;
		int tam, removido;
		while (falta_sortear > 0) {
			num_sorteado = (int) (Math.random() * candidatos);
			// sorteio

			if (pilha.contains(num_sorteado) == false) {
				pilha.add((num_sorteado+1));
				falta_sortear--;
			}

		}
		for (int i = 0; i < pilha.size(); i++) {
			System.out.print(pilha.get(i)+" ");
		}
	}
}
adriano_si

Perfeito Denis… minha ajuda tem um preço…

Pra você me pagar, basta adequar seu código ao padrão de nomenclatura Java.

Pode parecer besteira, mas começar fazendo certo é primordial.

E uma última dica… Quando você for iterar em Listas, você pode usar o for aprimorado. Vou te passar como eu tinha feito a solução e qualquer coisa você posta aqui.

package testesjava;
  
import java.util.ArrayList;
import java.util.Scanner;  
  
class TesteLista {  
    
    public static void main(String[] args) {  
        ArrayList<Integer> lista = new ArrayList<Integer>();  
        Scanner scan = new Scanner(System.in);  
        
        System.out.println("Candidatos: ");  
        int candidatos = scan.nextInt();  
        
        System.out.println("Ingressos: ");  
        int ingressos = scan.nextInt();  
        
        int faltaSortear = ingressos;  
        int numSorteado, pos = 0;
                
        while (faltaSortear > 0) {  
            numSorteado = (int) (Math.random() * candidatos); 
            
            if(!lista.contains(faltaSortear)) {
                lista.add(numSorteado);  
                faltaSortear--;
            }
        }
        
        System.out.println("Números Sorteados: ");
        for(Integer i : lista) // Aqui o for aprimorado que lhe falei. 
            System.out.print(i + " ");
    }  
}

Abs []

denisspitfire

??? oque deu errado? kkkkkkkk fiz só uma iteração e pronto…
código:

for (int i : pilha) {
			if(i==pilha.size()-1){
				System.out.println(pilha.get(i)+". ");
			}
			else System.out.print(pilha.get(i)+", ");
		}
erro

Exception in thread main java.lang.IndexOutOfBoundsException: Index: 5, Size: 2

at java.util.ArrayList.RangeCheck(Unknown Source)

at java.util.ArrayList.get(Unknown Source)

at main.main(main.java:29)
F

denisspitfire:
??? oque deu errado? kkkkkkkk fiz só uma iteração e pronto…
código:

for (int i : pilha) {
			if(i==pilha.size()-1){
				System.out.println(pilha.get(i)+". ");
			}
			else System.out.print(pilha.get(i)+", ");
		}
erro

Exception in thread main java.lang.IndexOutOfBoundsException: Index: 5, Size: 2

at java.util.ArrayList.RangeCheck(Unknown Source)

at java.util.ArrayList.get(Unknown Source)

at main.main(main.java:29)

</blockquote>

O problema provavelmente está no for.
O for aprimorado é diferente do convencional.
Nele vc diz o seguinte: Para cada inteiro existente na estrutura pilha faça algo.

Ou seja, se vc possui uma pilha com os valores 5, 8, 1. Seu i será 5 na primeira iteração, 8 na segunda e 1 na terceira.

Como sua pilha só tem 3 posiçoes, quando vc faz pilha.get(i), onde i = 5, ocorre a excessão de indice maior que o tamanho da estrutura.

Não sei se fui claro ^^

denisspitfire

E agora esta de acordo? só tem um pequeno problema… é para ser sorteado 1 vez somente… e… coloque 30 candidatos para 29 ingressos e veja se alguem repete… :frowning:

import java.util.ArrayList;
import java.util.Scanner;

class sorteio {
	public static void main(String[] args) {

		ArrayList<Integer> lista = new ArrayList<Integer>();
		Scanner scan = new Scanner(System.in);

		System.out.println("Candidatos: ");
		int candidatos = scan.nextInt();
		System.out.println("Ingressos: ");
		int ingressos = scan.nextInt();

		int faltaSortear = ingressos, numSorteado, i = 0;

		while (faltaSortear > 0) {
			numSorteado = (int) (Math.random() * candidatos);
			if (lista.contains(numSorteado) == false) {
				lista.add((numSorteado + 1));
				faltaSortear--;
			}
		}

		while (i < lista.size()) {
			if (i == lista.size()) {
				System.out.println(lista.get(i) + ". ");
			} else
				System.out.print(lista.get(i) + ", ");
			i++;
		}
	}
}
denisspitfire

mas este pedaço faz com que nao seja adicionado se ja contem o numero na pilha correto?

if (lista.contains(numSorteado) == false) {   
                lista.add((numSorteado + 1));   
                faltaSortear--;   
            }
F

denisspitfire:
mas este pedaço faz com que nao seja adicionado se ja contem o numero na pilha correto?

if (lista.contains(numSorteado) == false) { lista.add((numSorteado + 1)); faltaSortear--; }

E por que vc está adicionando + 1??

Se for sorteado 1, vai entrar no if, ainda nao tem na lista, vai adicionar 2 (1+1) na lista. Ai ele sorteia 1 de novo, que ainda não existe na lista e vai adicionar 2 (1+1) de novo.

E também, ao invés de if (lista.contains(numSorteado) == false) , faça if (!lista.contains(numSorteado)) que fica mais bonito. =P

denisspitfire

vlw! deu certo, pelo menos ao meu ver.

if (!lista.contains(numSorteado+1)) {
				lista.add((numSorteado + 1));
				faltaSortear--;
			}

Pq o +1… para que nao tenha 0 na resposta… estava aparecendo entao foi uma gambiarra que eu fiz.

denisspitfire

ou assim… gostei mais

import java.util.ArrayList;
import java.util.Scanner;

class sorteio {
	public static void main(String[] args) {

		ArrayList<Integer> lista = new ArrayList<Integer>();
		Scanner scan = new Scanner(System.in);

		System.out.println("Candidatos: ");
		int candidatos = scan.nextInt();
		System.out.println("Ingressos: ");
		int ingressos = scan.nextInt();

		int faltaSortear = ingressos, numSorteado, i = 0;

		while (faltaSortear > 0) {
			numSorteado = (int) (Math.random() * candidatos);
			if (numSorteado != 0) {
				if (!lista.contains(numSorteado)) {
					lista.add((numSorteado));
					faltaSortear--;
				}
			}

		}

		while (i < lista.size()) {
			if (i == lista.size()) {
				System.out.println(lista.get(i) + ". ");
			} else
				System.out.print(lista.get(i) + ", ");
			i++;
		}
	}
}
WellingtonRamos

o erro está nesta linha:

O Math.random não garante a não repetição.

WellingtonRamos
Fiz uma implementação diferente. Ao adicionar em ordem aleatória, obter a lista de sorteados é muito simples:
package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class sorteio {  
    public static void main(String[] args) {  

        Scanner scan = new Scanner(System.in);  

        System.out.println("Candidatos: ");  
        int quantidadeCandidatos = scan.nextInt();  
        System.out.println("Ingressos: ");  
        int quantitadeIngressos = scan.nextInt();
        
        List<String> listaCandidatos = 
        		new ArrayList<String>(quantidadeCandidatos); //Otimizando o tamanho da Lista
        
        //Preparando a lista de candidatos (colocados em ordem aleatória.
        for(int i = 1; i <= quantidadeCandidatos; ++i){
        	
        	//truque para embaralhar na lista ao invés de criar uma lógica mais complexa de embaralhamento
        	int ordemCandidato = (int) (Math.random() * listaCandidatos.size()); 
        	
        	//Adiciona o candidato em uma ordem "aleatória".
        	listaCandidatos.add(ordemCandidato, "C" + i);
        }
        
        //Obtem o limite de ingressos correto para não ocorrer exceção.
        //(poderia ser tratado através de exceção mas não achei adequado)
        int limiteSorteados = quantitadeIngressos < quantidadeCandidatos 
        		? quantitadeIngressos 
        		: quantidadeCandidatos;
        
        //Remove os candidatos não sorteados.
		List<String> listaSorteados = listaCandidatos.subList(0, limiteSorteados);
        
		//Imprime a lista de sorteados
        System.out.println(listaSorteados);
    }
}
WellingtonRamos

denisspitfire:
mas este pedaço faz com que nao seja adicionado se ja contem o numero na pilha correto?

if (lista.contains(numSorteado) == false) { lista.add((numSorteado + 1)); faltaSortear--; }


A implementação de lista que vc está usando não garante a não repetição. Se inserir o mesmo objeto 10 vezes, ele aparecerá 10 vezes.

Criado 6 de março de 2012
Ultima resposta 8 de mar. de 2012
Respostas 21
Participantes 5