Mega - Sena repetida :(

41 respostas
sgtbreitner
Olá pessoal! to com um pequeno probleminha aki q se fosse na vida real daria uma boa dor de cabeça... rsrs Fiz um programa simulando a mega sena... mas ele ta repetindo os numeros, já caçei várias formas p evitar isso, mas nao to conseguindo... o que fazer p ele não repetir mais? segue o código:
import javax.swing.JOptionPane;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
   
    sena1 rodar = new sena1();
     
    int pergunta = JOptionPane.showConfirmDialog(null, "Deseja realizar sorteio?");   
      if(pergunta != 0)
      JOptionPane.showMessageDialog(null,"Obrigado!");
     
      else if(pergunta == 0){
      {
    
          do
      
          {    
      for (int i = 0; i<6; i++){
        
        rodar.definirnumeros();
        rodar.guardanumero();
        
    }
      
      
      
  JOptionPane.showMessageDialog(null,"Os números sorteados são: "+ rodar.guarda );
  rodar.guarda = ""; 
  pergunta = JOptionPane.showConfirmDialog(null,"Deseja realizar novo sorteio?");
     if (pergunta != 0){
         JOptionPane.showMessageDialog(null, "Obrigado!");
    
     }  
     
      }
         
    while (pergunta == 0);
         
   }
  }
 }
}
e a classe auxiliar:
import java.util.ArrayList;
public class sena1 {
 
   
    
int num[] = new int[60];    
int i;
String guarda = " ";

 
public int gerarnumeros()
{
    return (int) (Math.random() * 60 + 1);
}

public void definirnumeros()

{
    
    num[i] = gerarnumeros(); 
    
}  

public void guardanumero()

{
      guarda = guarda  + num[i] + ", "; 
      
   }                         
          
}
Vlw!

41 Respostas

Foxlol

Vê se ajuda:

http://www.guj.com.br/java.tutorial.artigo.17.1.guj

Flw

B

sgtbreitner:
Olá pessoal! to com um pequeno probleminha aki q se fosse na vida real daria uma boa dor de cabeça… rsrs
Fiz um programa simulando a mega sena… mas ele ta repetindo os numeros, já caçei várias formas p evitar isso, mas nao to conseguindo… o que fazer p ele não repetir mais? segue o código:

Guarde o resultado a cada sorteio. No próximo sorteio, compare o resultado com todos que estejam guardados. Caso você encontrar algum que já tirou antes, sorteie novamente até tirar um inédito. Repita ad nauseum.

tubiluki

vc teria que armazenar cada numero no array e depois comparar o numero sorteado com os anteriores pra ver se eram todos diferentes… e se for igual a algum numero anterior sortear de novo e armazenar no array.

vc tem um array mas so utiliza a primeira posicao dele sempre. dai nem precisaria do array.

e o if(pergunta != 0) … else if (pergunta == 0)

o segundo if se torna desnecessario, pois se pergunta for != 0 entao com certeza vai ser ==0

sgtbreitner

Então, a documentação do link eu já havia lido ela, ela é uma boa introdução aos números aleatórios, mas mesmo assim eu não consigo implementar o meu código… quando meu código gera os 6 números, do jeito que ele está, o código da margem para repetição entre os 6 números, p. ex: 0, 2, 2, 4, 10, 30 eu não to conseguindo fazer essa comparação acima… to tentando aqui mas não está dando certo… alguma dica?

tubiluki

cara,

as dicas ja foram dadas acima…

Lucas_Cavalcanti

Não usa o Math.random()

Usa o new Random().nextInt(60) + 1… ele vai fazer o que vc quer…

se vc usar

Random r = new Random();

for (i = 0; i < 6; i++)
     jogo[i] = r.nextInt(60) + 1

ele não vai repetir os números (pelo menos é esperado que não)…

ai eh soh verificar se tem números repetidos…

[]'s

sgtbreitner

ok, para descobrir se há números repetidos eu fiz assim:

public int gerarnumeros()
{
         
return new Random().nextInt(7) + 1;
    
}
public void definirnumeros()
{
    
      num[i] = gerarnumeros();
     if (num[i] == i ){
         i = gerarnumeros();
     }
}

mas ainda assim está saindo números repetidos, devo estar comparando de forma errada…??

tubiluki

sim…

vc deveria estar armazenando os numeros no array…

e a cada novo numero … comparando com os anteriores…

mas vc nao armazena nada… so o anterior…

dai nao tem como funcionar o que vc quer.

sgtbreitner

cara, não é má vontade minha, to tentando fazer isso que você falou, mas não to conseguindo, você sabe onde eu posso encontrar algo para pesquisar e resolver esse problema?

sgtbreitner

ou se tiver algum exemplo também ajuda!

robcoutinho

cara uma pergunta. . esse exercicio é pra aula de MAC ?

B

Você sabe armazenar valores em um array (ou numa List ou qqr outra coleção) e obter todos os valores do array de voltar para compará-lo com o número que você tem na mão?

sgtbreitner

sim, mas não deixa de ser uma duvida… você conseguiu?

sgtbreitner

Bruno

Não sei como fazer isso!

sgtbreitner

sim, você conseguiu?

sgtbreitner

Você sabe armazenar valores em um array (ou numa List ou qqr outra coleção) e obter todos os valores do array de voltar para compará-lo com o número que você tem na mão?

não, to pegando Java agora…

robcoutinho

sim, você conseguiu?

consegui cara . me manda por mp com seu msn ae eu tento te ajuda
abraco

maquiavelbona

Se você quer garantir que não haja números iguais sorteados, você pode usar Set e ir sorteando até o tamanho do set ser 6.

Até!

Marky.Vasconcelos

Algums códigos simpels que devem ajudar

public boolean contains(int[] numeros, int numero){

  for(int i : numeros)
   if(i == numero)
     return true;

  return false;
}

Assim voce pode sortear um numero verificar se ja contem se nao tiver voce adiciona se tiver voce sorteia denovo até conseguir apenas numeros validos.

gpd38

Fiz a algum tempo este programa, talves ajude

//Programa teste
import javax.swing.JOptionPane;

public class Teste {

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

		MegaSena f;

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

	}

}
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 MegaSena {

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

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

	public void GeraValores(int quantidade) throws Exception {

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

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

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

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

			mega.write("\n");
		}
		mega.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: mega.txt");
		BufferedReader arquivo = new BufferedReader(new FileReader(nome));
		String linha = arquivo.readLine();

		while (linha != null) {
			System.out.println(linha);
			linha = arquivo.readLine();
		}
		arquivo.close();
	}
}
P

Velho, nem testei. Foi aqui no coder do GUJ mesmo.

Vê se é assim:

import java.util.Random;

public class Lels {

	public static void main(String[] args) {
		//Aqui será colocado os numeros randômicos.
		int temporario = 0;
		int[] sorteados = new int[6];

		Random r = new Random();

		for (int i = 0; i < sorteados.length; i++) {
			temporario = r.nextInt(60);

			for (int j = 0; j < sorteados.length; j++) {
				System.out.println("Verificando iguais...");

				if (sorteados[j] == temporario) {
					System.out.println("Escolhendo outro elemento...");
					temporario = r.nextInt(60);

				} 
					
				
			}
			sorteados[i] = temporario;
			System.out.println("Sorteado: " + sorteados[i]);
		}

		for (int k = 0; k < sorteados.length; k++) {
			System.out.println("Sorteado final: " + sorteados[k]);
		}

	}
}

Vê se compila ai.

Valeu.

sgtbreitner

Ok pessoal, vou usar os exemplos fornecidos para resolver o exercício aqui. Se ainda der errado eu tenho uma forca aqui comigo… Agradeços a todos do tópico!!

G

Opa, e8 acabei de fazer esse mesmo exercicio na faculdade …
eu fiz um while que induz a fazer o for do vetor até que todos os espaços do vetor estejam diferentes…

while(v[0]==v[1]||v[0]==v[2]…v[4]==v[5]

sgtbreitner

cara, testei seu codigo e eles saem repetidos, basta colocar em vez de 60, colocar 10 que ele mostra os numeros repetidos…

G

ae eu acabei de testar e tah funcionando sim, se vc colocar um while para quando ele der os valores não tem como ele fugir …
ele tem de fazer todos os numeros iguais para sair da repetição

sgtbreitner

guilherme marques:
ae eu acabei de testar e tah funcionando sim, se vc colocar um while para quando ele der os valores não tem como ele fugir …
ele tem de fazer todos os numeros iguais para sair da repetição

entendi, mas se fosse um vetor de 1000 posições estria perdido fazendo desta forma…

leobr84

Da uma análisada ae e ver se te ajuda man, vlw.

for (int i = 0; i < 6;) {
            aux = (int) (Math.random() * 60);

            for (int j = 0; j < 6;) {

                if (valores[j] == aux) {
                    aux = (int) (Math.random() * 60);
                    j = 0;
                } else {
                    j++;
                }
            }
            valores[i] = aux;
            i++;
}
P

cara, testei seu codigo e eles saem repetidos, basta colocar em vez de 60, colocar 10 que ele mostra os numeros repetidos…

Han? Mostra o teu codigo ai. Não faz sentido isso, ao menos na lógica, ele não mostraria mesmo.

maquiavelbona
Random rnd = new Random();
Set numerosSorteados = new HashSet();
while (numerosSortedos.size()<6){
  numerosSorteados.add(rnd.nextInt(60)+1);
}

Com isso você vai ter um Set com 6 objetos sorteados e todos serão diferentes.

Até!

P

Verdade. Testei aqui, ele só pula uma vez e por isso que acontece isso.

Deixa eu ajeitar…

sgtbreitner

cara, testei seu codigo e eles saem repetidos, basta colocar em vez de 60, colocar 10 que ele mostra os numeros repetidos…

Han? Mostra o teu codigo ai. Não faz sentido isso, ao menos na lógica, ele não mostraria mesmo.
eu soh mudei essa parte do codigo:

temporario = r.nextInt(60);

em vez de 60 coloquei 10, dai ele repetia alguns numeros…

P

Velho ,se vc btivesse 1000 posições em um array para checar, você só poderia fazer isso de dois jeitos: Ou criando uma espécie de índice para analisar ou um controle mais inteligente (o meu eu perco processamento, pq eu nao estou pesquisando nas posições que se abrem, estou pesquisando em todas mesmo quando só tem um elemento no array. Vou ajeitar isso.

sgtbreitner
leobr84:
Da uma análisada ae e ver se te ajuda man, vlw.
for (int i = 0; i < 6;) {
            aux = (int) (Math.random() * 60);

            for (int j = 0; j < 6;) {

                if (valores[j] == aux) {
                    aux = (int) (Math.random() * 60);
                    j = 0;
                } else {
                    j++;
                }
            }
            valores[i] = aux;
            i++;
}

deu certo cara!! deu certo!!! 3 urras p vc!!
urra!! urra!! urra!!!

sgtbreitner

Bom pessoal, agradeço a todos por postarem aqui, sei que tenho muita coisa para ver e aprender, com certeza este site esta fazendo a diferença no meu estudo em JAVA. Quando minha bagagem cultural sobre JAVA for maior, também com certeza irei ajudar e repassar o conhecimento!
Mais uma vez obrigado!

B
public class MegaSena
{
    public static void main(String[] args)
    {
        Sorteio sorteio = new Sorteio(60);

        for (int i = 0; i < 6; i++)
            sorteio.sortear();

        System.out.println(sorteio.quantidadeSorteada()
                + " números foram sorteados: "
                + sorteio.getSorteados());
    }
}
import java.util.Collections;
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;

public class Sorteio
{
    private final int MAXIMO;
    private Random rand;
    private SortedSet<Integer> sorteados;

    public Sorteio(int tamanho)
    {
        if (tamanho > 0)
        {
            MAXIMO = tamanho;
            rand = new Random();
            sorteados = new TreeSet<Integer>();
        } else
            throw new IllegalArgumentException("Tamanho deve ser maior que zero.");
    }

    public int sortear()
    {
        int numero = 0;

        if (quantidadeSorteada() < MAXIMO)
        {
            do
            {
                numero = (int) (rand.nextFloat() * MAXIMO) + 1;
            }
            while (sorteados.contains(numero));

            sorteados.add(numero);
        }

        return numero;
    }

    public SortedSet<Integer> getSorteados()
    {
        return Collections.unmodifiableSortedSet(sorteados);
    }

    public int quantidadeSorteada()
    {
        return sorteados.size();
    }
}
G

o que ide vcs estão usando ?
net beans ?

sgtbreitner

eu uso o netbeans

leobr84

netbeans 6.0.1

javaEd.com

Caro sgtbreitner ,

Experimente fazer isso!

private static boolean temRepetido(int[] num) {
		for (int i = 0; i < num.length - 1; i++) {
			for (int j = i + 1; j < num.length; j++) {
				if (num[i] == num[j]) {
					return true;
				}
			}
		}

		return false;

	}

implemente esse método e faça a chamada dele da seguinte forma :

int[] num = new int[6];

		do {
			método para sortear os números aleatórios (num);
		} while (temRepetido(num));

Qualquer dúvida poste ae cara, e lembre - se, mesmo sabendo que existe Collection Framework, se quer aprender arrays, tente fazer exemplos do tipo, vetores de ordenação, bubble sort, comparação de valores de indíce de vetores, e assim por diante ....

Espero ter ajudado
na paz :)

ivo_costa

Não quero cortar o teu barato, mais já faz 3 desde a última msg, eu acho que o cara já terminou a cadeira…

javaEd.com

[i]Não importa cara, outras pessoas podem ter a mesma dúvida, e esclarecerem da mesma forma :slight_smile:

abraços[/i]

Criado 5 de junho de 2008
Ultima resposta 1 de set. de 2008
Respostas 41
Participantes 14