você está aqui: Home → Colunistas → Cantinho do Shell
Por Rubens Queiroz de Almeida
Data de Publicação: 03 de Novembro de 2006
Sempre que somos chamados a participar de um bolão, quando a loto acumula, temos que enviar alguns números para montar os cartões
Este script cria, aleatoriamente, uma sequencia de 10 conjuntos de seis números, e pode ajudar a vencer os bloqueios criativos para montar tantos cartões em pouco tempo.
O segredo do script, a geração de números aleatórios, é obtida através do programa perl:
perl -e "print int(rand($lastnum+1))+$firstnum;"`
Nós invocamos a função rand
do perl, passando-lhe dois argumentos:
o primeiro número da sequencia (firstnum) e o último número
(lastnum).
A função rand
do perl, gera um número ENTRE 0 e um valor que lhe passamos como argumento.
Note que na expressão $lastnum+1
passada à função rand
, nós somamos
mais um, visto que a função rand
gera números ENTRE os limites que lhe passamos.
Como nós desejamos gerar números aleatórios entre um intervalo, ao resultado gerado pela
função rand
, nós temos que somar o valor do primeiro número da faixa:
Adicionalmente, como eu estou interessado apenas em números inteiros, eu precedi
a chamada da função rand
com a diretiva int
.
rand($lastnum+1))+$firstnum;
Resumindo, para o script da loteca, eu preciso de números entre 1 e 60, que são os valores possíveis.
A explicação sobre o restante do script eu incluo como comentário no próprio código.
Boa sorte :-)
#!/bin/bash # Definição da faixa de valores para a geração # dos números aleatórios. Esta faixa de valores # vai de 1 até 60 firstnum=1 lastnum=60 var0=0 cartoes=10 # Todo script CGI precisa começar com uma linha # indicando o tipo de arquivo, em nosso caso, # html A diretiva echo vazia é usada apenas para # criar uma linha em branco, também obrigatória # O cabeçalho montado é bastante simples, mas # poderiamos aqui montar qualquer tipo de cabeçalho # html que desejarmos echo "Content-type:text/html"; echo echo "<HTML><BODY><TITLE>Loteca</TITLE>"; # Montamos aqui a tabela, que irá conter os números gerados echo "<TABLE ALIGN=CENTER>"; # Temos aqui dois laços, um que controla o número # de cartões a serem gerados, controlado pela # variável var0, cujo valor se inicia em 0 e vai # sendo aumentado em uma unidade a cada execução do # laço. A montagem do cartão em si é controlada # pelo segundo laço, através da variação das # variáveis i e j while [ "$var0" -lt "$cartoes" ] do echo "<TR>" i=0 j=6 while [ "$i" -lt "$j" ] do Random=`perl -e "print int(rand($lastnum+1))+$firstnum;"` echo -n "<TD ALIGN=RIGHT>$Random</TD>" i=`expr $i + 1` done echo var0=`expr $var0 + 1` echo "</TR>" done echo "</TR>" echo "</TABLE>" echo "</HTML></BODY>"
Eu uso estes mesmos conceitos para diversas outras finalidades. Nos sites Contando Histórias e Aprendendo Inglês eu uso scripts baseados nesta técnica, que selecionam, a partir do conteúdo já existente nos sites, uma das mensagens. Este script é acessado, nos dois sites, em um link chamado Mensagem Aleatória, que se encontra na barra de navegação no lado esquerdo. Na semana que vem eu comentarei sobre esta nova forma de uso desta técnica.
Existem diversas outras possibilidades para geração de números aleatórios em shell scripts. Caso você conheça outras formas de realizar esta tarefa, sinta-se a vontade para usar o campo de comentários.
Como comentário final, gostaria de chamar a atenção de que este script possui uma falha óbvia. Ele não controla a existência de números duplicados em um mesmo cartão. Fica aqui então a sugestão para os leitores para uma possível melhoria.
Se você quiser tentar a sorte, pode usar o script, bem aqui no site da Dicas-L.
Boa sorte :-)