Qual o maior número da variável RANDOM?

Publicado por Alexandre Gonçalves Monteiro da Silva em 14/09/2011

[ Hits: 7.556 ]

Blog: https://www.vivaolinux.com.br/~alexandre_gms

 


Qual o maior número da variável RANDOM?



Pessoal, a variável RANDOM no Linux tem por objetivo gerar um número aleatório. O comando:

echo $RANDOM

Exibirá um número aleatório por vez. Tive a curiosidade de saber qual o maior número que esta variável poderia gerar. Após criar um script que atendesse este meu objetivo, verifiquei que o maior número é o 32767.

Com este resultado tive outra curiosidade: "Quantas vezes, em média, precisamos executar a variável RANDOM para vermos o numero 32767?"

No script bolei a seguinte forma: é um loop infinito que dispara a variável RANDOM e verifica se a mesma chegou ao 32767. Assim que identificar este número uma mensagem é enviada ao log relatando quantas execuções do random foram necessárias. Em seguida o script volta ao seu início, zera o contador e manda bala de novo.

Esperei o meu teste encontrar o número 32767 por 60 vezes e tirei uma média dos valores. Veja as primeiras linhas do log:

Necessitou de 31487 vezes para atingir o numero maximo
Necessitou de 37449 vezes para atingir o numero maximo
Necessitou de 56487 vezes para atingir o numero maximo
Necessitou de 46726 vezes para atingir o numero maximo
Necessitou de 34105 vezes para atingir o numero maximo
Necessitou de 12219 vezes para atingir o numero maximo
...
...
...

Tirei a média somando as vezes (loop) e dividindo pela quantidade de linhas, que no meu caso foram 60 rodadas. A média foi de 34117.

Este exemplo é apenas para treinar uma lógica de programação em shell-script, pois não tem utilidade alguma no dia-a-dia, se tem eu não conheço!! :-/

É como aqueles exercícios de colégio/vestibular:

- Para que você quer saber a quantidade de Joules que o João utilizou para quebrar o tijolo?
- Qual a finalidade de saber a quantidade de metros cúbicos da mistura de gases dentro de um recipiente?
- Por que tantas fórmulas gigantescas de trigonometria para achar um ângulo?

E por aí vai...

Esta dica é apenas para treinar mesmo! Se alguém descobrir alguma utilidade me conta :-)

Segue o script:

#!/bin/bash

k=0
j=0

while true
do

i=`echo $RANDOM`

     if [ $i -ge $j ]; then

          j=$i
          echo "Maior numero: $i"
          if [ $i -eq 32767 ]; then

                echo "Necessitou de $k vezes para atingir o numero maximo" >> maximo.txt
                k=0; j=0

          fi

     else

          echo "Maior numero: $j"

     fi

let k++

echo -e "Quantidade de rodadas: $k\n"

done

Só salvar e rodar, bom divertimento!! :-)

Outras dicas deste autor

Como economizar na digitação do seu prompt?

Como realizar consultas em vários servidores simultaneamente

Leitura recomendada

Achar ip válido e jogar para uma variável

Como lidar com variáveis retornadas pelo Expect - removendo CR do fim de linha

Site para montar regras de iptables

Hora no prompt do terminal

Shell Script - Imprimindo nome da própria função em execução

  

Comentários
[1] Comentário enviado por AprendiNoLinux em 14/09/2011 - 06:51h

Testar a probabilidade e verificar quantas pesquisas serão necessárias para encontrar esta dica no google ? rsrs

Neste jogo rsrs http://www.vivaolinux.com.br/script/Blackjack-simples-para-estudo-de-iniciantes-em-C

[2] Comentário enviado por alexandregms em 14/09/2011 - 12:49h

hehe..já apareceu uma idéia!

[3] Comentário enviado por ramoni em 14/09/2011 - 16:54h

Saber qual o maior número tudo bem, é uma curiosidade válida.
Agora, ter q desenvolver um script pra saber em media de quantas em quantas vezes sai ela é preciso ?
É como fazer um script pra saber quantas vezes cai 5 em numeros de 1-10. 10% das vezes, claro.

[4] Comentário enviado por Teixeira em 14/09/2011 - 17:31h

Tem uma música dos Britos (aquele conjunto ingrêis) que diz mais ou menos assim:

Ih, cara, hoje eu li os jornais!
2000 buracos em Blackbourne, em Lancashire;
Tiveram de contar eles todos;
Agora já sabem quantos buracos precisa
para encher o Albert Hall...
Se liga, ô meu!...


(Tradução "pra lá de livre" de um trecho de "A Day in a Life" do album Sgt. Peppers)


[5] Comentário enviado por Teixeira em 14/09/2011 - 17:34h

Para contar gado com perfeição:
Contam-se as pernas, multiplica-se por 4 e divide-se o resultado pela raiz quadrada de 256.
Os resultados tem sido exatos no tocante a gado bovino, porém acredita-se haver um bug quando tentamos a contagem de avestruzes.


[6] Comentário enviado por alexandregms em 14/09/2011 - 18:07h

Fiquem calmos!
Eu disse no artigo que isso não tem utilidade, mas pegar a lógica é algo interessante para quem deseja aprender mais dos conceitos de shell-script!
Eu disse no decorrer da dica que não tem utilidade alguma para o dia a dia!
Palma palma palma, nao priemos canico! :-)

[7] Comentário enviado por AprendiNoLinux em 14/09/2011 - 21:53h

Probabilidades do chapolim :) http://www.youtube.com/watch?v=kdVwd5iwDO4&feature=related

[8] Comentário enviado por santosbrc em 15/09/2011 - 15:15h

Este script é muito mais interessante do que parece. Além de ser um execício de imaginação ele pode ser usado para testar a aleatoriedade da variável.

Usando este script para coletar uma base de dados de digamos umas 100.000 repetições permitiria realizar um teste estatístico que mostraria se $RANDOM é aleatório ou possui algum tipo de vício, Isso é importante para quem usa o ShellScript/R/SciLab e os recursos do /dev/random para criptografia ou análise estatística. Se a variável e o gerador de entropia do linux não forem tão aleatórios assim significa que seguem princípios de matemática do caos. Isso seria o começo do fim para as chaves pgp, por exemplo.

Parabéns Alexandre, você acaba de fazer ciência!

[9] Comentário enviado por Teixeira em 15/09/2011 - 16:44h

Não sei agora, mas logo quando os processadores evoluíram do Zilog Z-80 para o 8086 houve algum problema na geração da raiz randômica, que produzia números que se repetiam com uma frequência um tanto indesejável.
Os '286, '386 e '486 ainda tinham o mesmo problema.
Daí em diante não acompanhei mais.
Some-se a isso qualquer outra particularidade do software, e teremos aí a mais perfeita manifestação da lei de Murphy...


[10] Comentário enviado por GilsonDeElt em 15/09/2011 - 16:59h

rafaelocremix, ótima aplicação essa aê!

e alexandregems, te perguntar uma coisa??
Como cê tem certeza de que esse é o maior número que $RANDOM gera?

Um teste legal que te indico é: gere um número com $RANDOM, e grave num arquivo.
Gere outro, compare com o que está no arquivo e, se o número novo for maior, grave-o no arquivo.
Se for menor, descarte-o.
Deixe o script rodando assim por vários minutos, ou então adicione um contador que diga quantos números gerados foram já comparados.

Ou melhor, adicione dois contadores, sendo o outro para dizer quantas vezes já ocorreu o 32767.

32767 = ((2^15) - 1), o que indicaria que essa
é uma 'variável' de 15 bits, e acho que ela não tem de ser
necessariamente de 15 bits.

De todo jeito, tá de parabéns pela idéia, alexandregems!
Aplicações malucas pra isso, a gente arruma depois ;-)

[11] Comentário enviado por removido em 15/09/2011 - 18:40h

Hum, isso quer dizer que o maior número gerado da varável RANDOM é de 16 bits?

[12] Comentário enviado por albertguedes em 15/09/2011 - 18:46h

Em busca de um gerador real de números aleatórios ...

[13] Comentário enviado por alexandregms em 15/09/2011 - 19:24h

Realmente o comentário do ramoni pode ter razão, pois a média para chegar no 32767 ou qualquer outro número é a mesma na teoria, mas vai que a variável random tem algum tipo de variação..com esta duvida fui verificar a quantidade de outros números e basicamente parece ser uma média geral mesmo. Se bem que para ter esta certeza são necessários outros testes...

O Teixeira é extremamente preciso em seus cálculos, ainda mais quando se trata de estatística, este sim nasceu para os números! :-)

GilsonDeElt, vc quer saber como eu cheguei no 32767, certo?
Segue o script:

#!/bin/bash
i=0
j=0

while true
do

i=`echo $RANDOM`

if [ $i -ge $j ]; then

j=$i
echo "Maior numero: $i"

else

echo "Maior numero: $j"

fi

let k++
echo -e "Quantidade de rodadas: $k\n"

done


Deixei ele executando por umas 8 horas seguidas, não lembro exatamante a quantidade de loops, mas deve ter passados os bilhões..
Para chegar ao 32767 leva em torno de 20 segundos na máquina que estou testando, claro que isso também depende do processador..



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts