É Pá e Bola com o SQL Server – ⑤

Sessão É Pá e Bola com o SQL Server, dicas rápidas, simples e práticas, sem se preocupar com formalidades….

Olá, bom dia….

Este é mais um post da nova Sessão É Pá e Bola com SQL Server.

Aqui o papo vai ser simples e direto, sem formalidade, com dicas rápidas para se fazer algo relacionado com Microsoft SQL Server de forma geral.

Você pode estar se perguntando o porque deste nome, eu já te respondo.

O porque é que todas as dicas a serem compartilhadas estão envolvidas com esportes praticados com bola, mas certamente outras modalidades terão seu devido destaque.

No É Pá e Bola com o SQL Server – ⑤, vamos aprender como no Microsoft SQL Server temos a possibilidade de sortear os chamados números aleatórios (pseudoaleatórios), mas que na verdade não estamos realizando um sorteio ou selecionando um valor numérico de forma randômica, existe um elemento importante nesta história que você precisa conhecer antes de colocar a mão na massa, como eu sempre costume dizer para os meus alunos, é como se estivessemos jogando bilhar com os olhos vendados, algo como tentar metar aquela bola que esta do outro lado de mesa somente imaginando como fazer, mas sem saber exatamente como pode ser feito.

Quando pensamos na possibilidade de se sortear ou gerar números aleatórios, bem como, uma possível sequência, na verdade estamos aplicando o chamado Método ou Simulação de Monte Carlo. Esta simulação faz parte do conjunto de métodos estocásticos, baseados na habilidade de geração e números aleatórios que representam uma variável aleatória distribuída uniformemente em [0,1].

Na prática, não é possível gerar de forma realmente aleatória valores de uma distribuição uniforme, entretanto, é possível gerar, de forma determinística, uma sequência de valores que parecem ser aleatórios e uniformemente distribuídos no intervalo [0,1]. Neste sentido, geramos o que são conhecidos por números pseudoaleatórios.

Uma sequência de números pseudoaleatórios {Ui}i1{Ui}i≥1 é uma sequência determinística de números do intervalo [0,1] que, embora tenham sido gerados de forma determinística, parecem ser aleatórios e distribuídos uniformemente. Além disso, esta sequência possui propriedades estatísticas relevantes.

Entendemos por propriedades estatísticas relevantes que, qualquer teste estatístico aplicado para detectar desvios da aleatoriedade não rejeite a hipótese de aleatoriedade. Uma das principais propriedades de uma sequência de números pseudoaleatórios é a falta de previsibilidade.

Por exemplo, no método proposto por Von Neumann, se iniciarmos por 2.1002.100 obtemos 4.100, 8.100, 6.100, 2.100, 4.100,… 4.100, 8.100, 6.100, 2.100, 4.100,…, que nos leva a recusar tal método, pois dependendo da condição inicial, podemos gerar uma sequência com período muito pequeno, neste caso 4.

Justamente esta falta de previsibilidade dos números pseudoaleatórios que nos faz estabelecer uma conexão entre a geração de tais números e a criptografia, a arte ou ciência de transformar sequências aparentemente aleatórias em dados originais (informações).

Agora que você já conheceu um pouco sobre este conceito e elementos que nos fazem pensar na possibilidade de se “sortear” um valor aleatório, vamos ver de forma prática como podemos inicialmente sortear um possível número e depois como é possível determinar a escolha de números dentro de faixas de valores preestabelecidas, para tais procedimentos estaremos fazendo uso da função de sistema RAND(), conforme os exemplos apresentados abaixo.

 

— Exemplo 1 – Bloco de Código —

Select Rand() As ‘Aleatório’
Go

 

Até aqui tudo tranquilo! Algo bem simples nós fizemos! Note que a função RAND() sempre realiza o sorteio de valor números retornando um pseudoaleatório com o tipo de dados float, dentro da faixa limitante de valores entre 0 e 1.

Mas se quisermos melhor um pouco este exemplo, fazendo novamente a geração de um pseudo número, mas aplicando uma operação matemática, algo do tipo Soma ou Multiplicação, algo bem possível de ser realizado e também muito simples.

 

— Exemplo 2 – Bloco de Código —

Select Rand()*2 As ‘Valor Aleatório * 2’,
           Rand()+4 As ‘Valor Aleatório + 4’,
           4+Rand() As ‘Número 4 somando ao Valor Aleatório’
Go

 

Neste segundo exemplos, estamos justamente realizando duas das mais tradicionais operações matemáticas, as duas primeiras colunas estamos realizando a geração do pseudoaleatório combinando com as operações, ao contrário da última coluna que estamos pegando o número 4 e somando com o resultado do valor aleatório sorteado.

 

A Figura 1 apresentada abaixo, ilustra o resultado obtido após a execução do Exemplo 2:

Figura 1 – Resultado obtido após a execução do Exemplo 2.

 

Agora imagine que você deseja novamente realizar este possível sorteio de valores numéricos, algo muito parecido com um jogo da mega sena, no qual temos a possibilidade de solicitar que até seis números sejam “escolhidos”. Este é outro cenário bem interessante que a função RAND() pode ser aplicada, ainda mais se fizermos uso de algumas operações matemáticas como forma de se estabelecer a escolha de valores dentro de faixa de números preestabelecidas.

O exemplo 3 apresentado a seguir, ilustra de forma simples como podemos fazer isso:

— Exemplo 3 – Bloco de Código —

Select Convert(Int, 10*Rand()) As Numero1Sorteado,
           Convert(Int,10 + (10)*RAND()) As Numero2Sorteado,
           Convert(Int,20 + (10)*RAND()) As Numero3Sorteado,
           Convert(Int,30 + (10)*RAND()) As Numero4Sorteado,
           Convert(Int,40 + (10)*RAND()) As Numero5Sorteado,
           Convert(Int,50 + (10)*RAND()) As Numero6Sorteado
Go

Se você observar o bloco de código compartilhado acima, poderá notar que cada coluna irá retornar números “sorteados” dentro de uma faixa específica, conforme destaco abaixo:

  • Coluna – Numero1Sorteado – Valores entre 0 e 9;
  • Coluna – Numero2Sorteado – Valores entre 10 e 19;
  • Coluna – Numero3Sorteado – Valores entre 20 e 29;
  • Coluna – Numero4Sorteado – Valores entre 30 e 39;
  • Coluna – Numero5Sorteado – Valores entre 40 e 49; e
  • Coluna – Numero6Sorteado – Valores entre 50 e 59.

Em adicional, estou utilizando a função de conversão de dados Convert() para se estabelecer uma conversão explícita, transformando a apresentação dos valores sorteados pela função RAND(), os quais por padrão são retornados como float, agora convertidos e apresentandos como inteiros “int”.

 

A Figura 3 apresentada abaixo, ilustra o resultado obtido após a execução do Exemplo 3:

Figura 2 – Resultado obtido após a execução do Exemplo 3.

Desta forma, chegamos ao final…. simples, prático, rápido, mas nem sempre é fácil…..


É isso aí galera, aqui é É Pá e Bola com o SQL Server, espero que você tenha gostado….

Valeu….

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP – Faculdade de Informática e Administração Paulista de São Paulo. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove – Campus São Roque. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1994 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator – Administrador de Banco de Dados – SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, entre outros recursos. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, etc. Trabalhei entre 2011 e 2017 como Administrador de Banco de Dados e Coordenador de TI no FIT – Instituto de Tecnologia da Flextronics, atualmente exerço a função de Professor Universitário na FATEC São Roque. CTO da Galvão Tecnologia, consultoria especializada em Gestão de TI, Administração de Servidores Windows Server, Bancos de Dados Microsoft SQL Server e Virtualização. Possuo titulação Oficial Microsoft MVP e reconhecimentos: MCC, MSTC, MIE e MTAC.