Usando números aleatórios com Corona SDK

rantble

A biblioteca math.* do Corona permite que você facilmente gere números aleatórios para uso em seus apps. De embaralhar as cartas de um baralho até determinar o quanto dano seu herói elfo levou do sopro de fogo do dragão, números aleatórios podem ser uma parte crítica do desenvolvimento do seu jogo.

Dito isso, números aleatórios gerados pela maioria dos sistemas computacionais não são verdadeiramente aleatórios. Ao invés disso, eles são pseudo-aleatórios – quer dizer, eles são gerados por um algoritmo matemático que dá resultados razoavelmente aleatórios, mas com o passar do tempo, os números começarão a se repetir. Números verdadeiramente aleatórios, como aqueles do random.org, são gerados a partir da leitura de sinais de rádio do ruído atmosférico o que sempre terá um resultado diferente, e o site oferece uma API RESTful para retorná-los se seu projeto realmente precisar disso.

Em geral, números aleatórios gerados pelo Corona são “aleatórios o bastante” para a maioria dos casos. Existem duas funções envolvidas na geração dos mesmos:
math.randomseed()
math.random()

math.randomseed()

Em praticamente qualquer projeto que use números aleatórios, você deve incluir esta linha no topo do main.lua:

Isto irá garantir que seus números serão tão aleatórios quanto possível. Como? Bem, a função que na verdade gera os números aleatórios discutida abaixo, precisa de um valor inicial ou “seed” a partir do qual vai iniciar a cadeia de números aleatórios que será gerada. Usando valor de os.time(), o que nos dará o número de segundos desde 01/01/1970, o que lhe dará um seed diferente a cada vez que o ap for iniciado e portanto uma sequência diferente de números aleatórios.

Note que você somente precisa alimentar o gerador uma vez. Alguns desenvolvedores chamam math.randomseed() toda vez que vão chamar math.random() mas isto simplesmente não é necessário. Então você deve estar se perguntando “Porque o sistema já não inicializa a seed automaticamente?”. Bem, existem ocasiões onde você pode querer inicializar com um valor constante definido por você ao invés de os.time(). Se você o fizer, receberá sempre a mesma sequência de números aleatórios, o que pode ser útil dependendo do seu caso. Uma vez trabalhei em um jogo espacial onde eu precisava aleatoriamente gerar cada planeta, mas eu não podia manter as informações de todos planetas em memória todo o tempo. Passando um número específico para cada mundo ao math.randomseed(), eu obtinha a mesma sequência exata de números aleatórios que me permitia colocar as mesmas cidades nos mesmos lugares com as mesmas populações a cada execução.

Curso React Native

math.random()

A função math.random() é o que você irá chamar para gerar um número aleatório. Dependendo dos parâmetros que você passar, o resultado irá variar.

Gerando um valor entre 0 e 1

Ao chamar math.random() sem nenhum parâmetro irá lhe retornar um valor com ponto flutuante entre 0 e 1, por exemplo 0.22, 0.98, ou 0.56. Em Corona, isto pode ser útil para gerar valores de cores aleatórias, uma vez que os parâmetros RGB esperam valores entre 0 e 1. Por exemplo:

Gerando um valor entre 1 e um número máximo

Se você quer computar um intervalo de números inteiros, por exemplo o resultado de rolar dados de 6 lados, você pode fazer:

O resultado de math.floor( math.random()*6 ) gera um número entre 0 e 5, e adicionando 1 ao final obtém o seu intervalo desejado de 1-6.

Alternativamente, a função math.random() fornece muitos métodos utilitários que podem evitar que você tenha de computar seus números. Este código irá fazer exatamente a mesma coisa do anterior:

Gerando um valor entre um número inicial e um número final

Esta variante irá gerar um intervalo de números, neste exemplo entre -2 e 2 (incluindo o mesmo). Um grande exemplo desta variante é embaralhar uma table de dados fixos, como um baralho de cartas, onde você precisa usar todos os valores em uma ordem aleatória. Para mais exemplos, leia este tutorial de embaralhar tables (em Inglês).

Conclusão

Como pôde ver, gerar números aleatórios em Corona é simples. Com este conhecimento, você está armado com a habilidade de dar ao seu app alguns elementos realmente aleatórios.

Traduzido do original Tutorial: Understanding random numbers in Corona

* OBS: curtiu o post? Então dá uma olhada no meu livro de Corona SDK clicando no banner abaixo pra aprender a criar outros tantos apps incríveis!

Livro Corona SDK
Livro Corona SDK