Postagem em destaque

Criando bot do Telegram em Shell script com ShellBot

Gerando números aleatórios

clique na imagem para ampliar.

Um número aleatório pertence a uma série numérica que por definição não pode ser previsto a partir dos membros anteriores a sua série e é um conceito relativo à série numérica a que o número pertence.

Assim como em outras linguagem, o shell possui convenções que nos permite gerar números aleatórios a partir de um intervalo especificado, ou seja, determinar um número base inicial e final afim de garantir que o número gerado esteja dentro do intervalo estipulado; Ou simplesmente omitir o mesmo para gerar números dentro do intervalo máximo suportado.

Vou citar algumas formas para geração de números aleatórios. São elas:

1. $RANDOM

É uma variável de ambiente (bash building) que a cada vez que é referenciada, um número inteiro aleatório entre 0 e 32767 é gerado.
$ echo $RANDOM
24199
$ echo $RANDOM
2203
$ echo $RANDOM
10203

Para definir o valor máximo utilize a seguinte sintaxe:
$((RANDOM%VALOR_MAX+1))

Gerando um número aleatório que esteja entre 1 e 100.
$ echo $((RANDOM%100+1))
61
$ echo $((RANDOM%100+1))
76
$ echo $((RANDOM%100+1))
80

2.  /dev/urandom

É um arquivo especial que ativa o pool interno para produzir bits pseudoaleatórios.  Porém por si só não resolve o problema, pois lotaria a tela de lixo se imprimisse o seu conteúdo.

$ cat /dev/urandom
@V*���*�n\���P�K��B!�%�HB�E�a\(��#�S�UGZ�M�~>U6^�W���M5�
�Cs�k2��M!���ˏ�]d�e��U�Җ���|�G`����j��=V_�0������(��Y���h$z

É necessário tratar a saída, filtrar somente os dígitos e delimitar a quantidade  de caracteres a serem exibidos. Para isso teremos que utilizar os comandos a seguir:

$ tr -dc 0-9 < /dev/urandom  | head -c NUM_BYTES
Nota: NUM_BYTES é a quantidade máxima de bytes a serem lidos pelo comando (head).  Um caractere é igual a 1 byte.

Gerando um número aleatório entre 0 e 999 (considerando que o valor máximo tem 3 dígitos).
$ tr -dc 0-9 < /dev/urandom  | head -c 3
706
$ tr -dc 0-9 < /dev/urandom  | head -c 3
080
Nota: Os zeros iniciais não são descartados.

3. shuf

Um comando especifico para geração de números aleatórios que fornece algumas opções interessantes e de fácil aplicação (recomendado). Para sua execução é necessário que o usuário informe o intervalo ou elementos que deseja trabalhar. No caso especifico onde iremos trabalhar com números,  utilizaremos o parâmetro (-i, --input-range=LO-HI); Onde (LO) é o valor inicial e (HI) o valor final.

Por padrão o comando gera uma lista aleatória única contendo uma quantidade de elementos equivalentes a quantidade de números contidos no intervalo.

Gerando uma lista de números aleatórios de 1 à 5.
$ shuf -i 1-5
2
4
3
1
5
Nota: Todos os números dentro do intervalo foram listados, porém em uma ordem aleatória.

Gerando um único número entre 10 e 70.
$ shuf -i 10-70 -n 1
22
$ shuf -i 10-70 -n 1
66
$ shuf -i 10-70 -n 1
46
Nota: Utilizando o  parâmetro (-n NUM) é possível especificar a quantidade de elementos gerados, desde de que (NUM) seja igual ou menor que a quantidade de elementos do intervalo. Exceto se (-r) for utilizado.

Comentários

  1. É importante salientar que essas bibliotecas URANDOM e SRADOM não geram números aleatórios, mas sim pseudoaleatórios e embora sejam usadas para gerar senhas em alguns programas, não são recomendáveis para este fim. Números realmente aleatórios vem de fenômenos da natureza acoplados em medidores digitais. Onde o universo gerador de variáveis é quase impossível de se prever.

    ResponderExcluir

Postar um comentário

Contato

Nome

E-mail *

Mensagem *