Jump to content

Busca no banco de dados antes de gerar aleatoriamente as sequencias


jcvilanova

Postagens Recomendadas

Galera, fiz um sisteminha em java onde eu gero combinaçoes aleatorias mas antes de gerar os numeros eu informo a quantidade de dezenas e os limites a partir do numero 1. Antes de iniciar a geração das combinações numéricas eu insiro as dezenas ou numeros que nao quero que estejam no sorteio. Tenho um banco de dados com todos os sorteios anteriores cadastrados, com os seguintes campos: NumeroSorteio, Dezena1, Dezena2, Dezena3, Dezena4, Dezena5, Dezena6. 

Eu gostaria de melhorar essa logica, fazendo o seguinte: ao inves de apontar para o sistema quais numeros nao deverao ser utilizados na geração das combinações, eu gostaria que o sistema fosse ate o Banco e verificasse se o numero gerado já existe, se exisir, ele nao utiliza, se nao, ele utiliza e gera a combinação. 

Ai via o meu codigo

 

janelaPrincipal.setTitle("Gerar Números");
		

		btAddNumero.addActionListener(new ActionListener() {

			int count = 0;
			//int tmp=0;
			
			List<Integer> valoresRejeitados = new ArrayList<>();
			ArrayList<Integer> valoresAceitos = new ArrayList<Integer>();
			Random valorRandomico = new Random();
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				int tmp = 0;
				int temp = Integer.parseInt(field1.getText());
				String temp2 = String.valueOf(temp); 
				if (count < 5) {
					
					if(!valoresRejeitados.contains(temp)){
						
						valoresRejeitados.add(temp);
						label3.setText(valoresRejeitados.toString());
						
						count++;
					}else{
						JOptionPane.showMessageDialog(null, "Este número já foi inserido!");
					}
				}
				if(count==5){
					/*
					 * for que gera 10 combinações de números
					 */
					for(int j=0; j<340; j++){
						//limpa a lista de combinações
						valoresAceitos.clear();
						System.out.print("Combinação #" + (j+1) + "{");
						
						/*
						 * for que gera os cinco numeros de cada grupo
						 */
						for(int k=0; k<5; k++){
							
							/*
							 * o while se repete enquanto o numero gerado for repetido
							 */
							while(true){
								
								//gera numero aleatório entre 1 e 25
								tmp = 1 + valorRandomico.nextInt(80);
								
								/*
								 * verifica se a lista de combinações(valores aceitos) contem numeros repetidos
								 * digitados ou gerados
								 */	
								if(!valoresAceitos.contains(tmp) && !valoresRejeitados.contains(tmp)){	
									valoresAceitos.add(tmp);
									
									//sai do laço while
									break;
								}
							}
							//exibe o numero gerado
							System.out.print(" " + tmp);
						}
						System.out.println("}");
						
						switch (j) {
						case 0:
							label4.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label4.repaint();							
							break;
						case 1:
							label5.setText("Combinação "+(j+1)+ ": " + valoresAceitos.toString());
							label5.repaint();							
							break;
						case 2:
							label6.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label6.repaint();							
							break;
						case 3:
							label7.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label7.repaint();							
							break;
						case 4:
							label8.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label8.repaint();							
							break;
						case 5:
							label9.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label9.repaint();							
							break;
						case 6:
							label10.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label10.repaint();							
							break;
						case 7:
							label11.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label11.repaint();							
							break;
						case 8:
							label12.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label12.repaint();							
							break;
						case 9:
							label13.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label13.repaint();							
							break;
                                                case 10:
							label14.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label14.repaint();							
							break; 
                                                case 11:
							label15.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label15.repaint();							
							break; 
                                                case 12:
							label16.setText("Combinação "+(j+1) + ": " + valoresAceitos.toString());
							label16.repaint();							
							break;    
						

						default:
							
							break;
						}

 

Link to comment
Compartilhe em outros sites

Não fiz não. Na verdade, fiz a mesma coisa em PHP pois achei mais facil, porem, me deparei com outro problema. Não sei como fazer a INSERÇÃO no Banco e gostaria de quando salvar que fosse salvo em ordem crescente. Veja o código em PHP. Se puder dar uma força agradeço. 

function ja_existe($jogo, $stmt) {
    $stmt->execute($jogo);
    return $stmt->fetchColumn() > 0;
}

$Numjogos = $_POST["jogos"];
$Qtydezenas = $_POST["dezenas"];
$Valormin = $_POST["de"];
$Valormax = $_POST["ate"];
$jogos = [];
$numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));

$Conn = // falta criar a conexão
$stmt = $Conn->prepare('select count(*) from NomeDaTabela where Dez_1=? AND Dez_2=? AND Dez_3=? AND Dez_4=? AND Dez_5=? AND Dez_6=?');
for ($i = 1; $i <= $Numjogos; $i++) {
    while (true) {
      
        shuffle($numeros);
       
        $sorteio = array_slice($numeros, 0, $Qtydezenas);
        sort($sorteio);
       
        if (! ja_existe($jogo, $Conn)) {
            $jogos[] = $sorteio;
            break;
        }
    }
}

 

Link to comment
Compartilhe em outros sites

Olá! No site da w3schools tem exemplos ótimos e simples de entender... Segue abaixo um exemplo para adaptar ao seu problema
 

<?php

// Dados da conexão
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// Modifique para o seu SQL
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if ($conn->query($sql) === TRUE) {
  echo "New record created successfully";
} else {
  echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>
Link to comment
Compartilhe em outros sites

Olá amigo, dei uma olhada em tudo e fiz algumas correções. Está rodando certinho até certo ponto. Está gerando as combinações, a conexão e o SELECT na tabela estão ok, compara o conteudo do SELECT com o array que ta recebendo os numeros gerados etc. Agora surgiu outro problema que nao to conseguindo resolver, a função que deveria comparar o conteudo do array com o resultado do SELECT ta dando erro. Já bati cabeça demais mas nao consegui resolver. Testei o código linha por linha e ta tudo certo, exceto ai. 

Veja meu código, quem puder testar, agradeço

 


<?php
// verifica se o jogo já existe no banco

function ja_existe($sorteio, $stmt) {
    $stmt->execute($sorteio);
    return $stmt->fetchColumn() > 0;
}

$Servidor = "localhost";
$Banco = "megasena";
$Usuario = "root";
$Senha = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $Numjogos = $_POST["jogos"];
    $Qtydezenas = $_POST["dezenas"];
    $Valormin = $_POST["de"];
    $Valormax = $_POST["ate"];
    $jogos = [];
    $numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));
}

   // $dez1 = 9;
  //  $dez2 = 37;
  //  $dez3 = 39;
   /// $dez4 = 41;
  //  $dez5 = 43;
  //  $dez6 = 48;

    $Conn = new PDO("mysql:host=$Servidor;dbname=$Banco", $Usuario, $Senha);
    //Antes eu estava fazendo a busca no Banco de Dados aqui, ocorre que os parametros da clausula WHERE ainda nao existiam, 
    //pois os numeros ainda não haviam sido escolhidos conforme linha 49
   // $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1= :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
  //  $stmt->bindParam(":d1", $dez1);
  //  $stmt->bindParam(":d2", $dez2);
  //  $stmt->bindParam(":d3", $dez3);
  //  $stmt->bindParam(":d4", $dez4);
  //  $stmt->bindParam(":d5", $dez5);
  //  $stmt->bindParam(":d6", $dez6);
  //  $stmt->execute();
    
  //  $dezenas = $stmt->fetch();

  //  print_r($dezenas);

    for ($i = 1; $i <= $Numjogos; $i++) {
        while (true) {
            // embaralho os numeros gerados
            shuffle($numeros);
         
            // retiro a quantidade de dezenas indicada no campo numero de jogos
           //$sorteio = array_slice($numeros, 0, $Qtydezenas);
          $sorteio = [10, 11, 29, 30, 36, 47];
 // aqui eu ordeno as dezenas escolhidas
           // sort($sorteio);
            // e então faço a busca no BD
            $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1 = :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
            $stmt->bindValue(":d1", $sorteio[0]);
            $stmt->bindValue(":d2", $sorteio[1]);
            $stmt->bindValue(":d3", $sorteio[2]);
            $stmt->bindValue(":d4", $sorteio[3]);
            $stmt->bindValue(":d5", $sorteio[4]);
            $stmt->bindValue(":d6", $sorteio[5]);
            $stmt->execute();
            $dezenas = $stmt->fetch();
 //  exit;
           
            ?> <br> <br>
            <?php

            // se não é jogo repetido, adiciona no Array $jogos
            // A função deveria verificar se a combinação gerada já existe no BD, mas ta dando erro

            if (!ja_existe($sorteio, $stmt)) {
                $jogos[] = $sorteio;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo nao existe: " .implode(', ', $sorteio). "<br>\n";
   break;
            }else{
                echo "Esse jogo já existe: " .implode(', ', $sorteio). "<br>\n";
      
            }
          
        }
    
        var_dump($jogos);
 ?> <br> <br> <br> <br>
 <?php

foreach ($jogos as $jogo) {
    // aqui eu gostaria de colocar um INSERT para passar os jogos gerados 
    //do Array $jogos para a tabela sorteio, e gostaria de imprimir na tela as cobinações
    
    "<br>\n" ;"<br>\n";
    echo "Os Jogos são: " .implode(', ', $jogo). "<br>\n";
}

}
?>
 
<form method="POST"> 

Numero de Jogos: <input type="text" size="10" name="jogos"> <br>
 
Quantidade de Dezenas em cada jogo: <input type="text" size="10" name="dezenas"> <br>
 
Iniciando em: <input type="text" size="5" name="de"> indo até:<input type="text" size="5" name="ate"> <br><br><br>
<input type="submit" name="BTEnvia" value="Enviar">  <input type="reset" name="BTApaga" value="Apagar">
       
<?php

?>
    
</body>
</html>
<br><br><br><br>

 

Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...