Random Number Generation (RNG)

**Random Number Generation**, também conhecido como **Random Number Generator** ou **RNG**, é um sistema que gera uma sequência de números entre um valor mínimo e um valor máximo. O RNG é utilizado para gerar resultados aleatórios, sendo um elemento comum em jogos, especialmente no gênero RPG e Roguelike.

## **Origem**

O conceito de geração de números aleatórios surgiu muito antes da tecnologia. Os romanos, por exemplo, inventaram um método de decidir arbitrariamente entre duas possibilidades ao jogar uma moeda para o alto. Eles o batizaram de "navia aut caput", que significa "navio ou cabeça", pois a moeda possuía um navio estampado em um de seus lados e a cabeça do emperador no outro; e que atualmente, é conhecido por nós como **cara ou coroa**.

E ainda antes do cara ou coroa, os **dados** já existiam, apesar da origem deles não ser tão certa. Dados datados de 5000 anos foram encontrados no Iraque e no Irã. Registros também dizem que eles já eram populares na China e na Índia há 4000 anos. O tipo de dado mais famoso dos dias de hoje - o dado de 6 lados - serve como mecanismo para escolher arbitrariamente uma dentre seis possibilidades, dando a cada uma a mesma chance de 16,67%.

## **Aplicação**

### **Engines**

#### **Unity**

A geração de números aleatórios no Unity é realizado através da função *Range* do pacote de recursos *Random*. Ao escrever **Random.Range** em seu código-fonte, o programador deve especificar também dois valores numéricos: um para o limite mínimo e outro para o limite máximo com os quais *Range* trabalhará. Assim, a função retorna um número qualquer dentro destes limites, podendo ele ser inteiro ou fracionado.

#### **Godot**

A geração de números aleatórios no Godot é semelhante à do Unity, mas com duas diferenças-chave:

1. O Godot possui duas funções random, **randi\_range** e **randf\_range**, que funcionam de maneira idêntica a Random.Range, porém mais especializadas, visto que *randi\_range* retorna apenas números inteiros e *randf\_range*, apenas fracionados.
2. As funções random do Godot embaralham seus números apenas uma vez, então caso o programador aplique elas sozinhas no seu código-fonte, ele receberá sempre o mesmo número. A solução para isso é acompanha estas funções da função **randomize**, que reembaralha os números sempre que chamada.

### **Videogames**

Nos videogames, o sistema de RNG pode ter diversas funcionalidades diferentes. A seguir, você encontra alguns exemplos de mecânicas aplicadas com RNG.

#### **Chance de acerto**

Uma chance de acerto entre o jogador e um NPC ou outro jogador. Essa chance pode ser estabelecida a partir de um atributo que fornece o acerto para o jogador contra um atributo de defesa de um alvo, podendo ser exibido o percentual de acerto como as franquias *X-COM* e *Fallout* fazem.

Outro tipo de chance de acerto que envolve o RNG é a comparação de números gerados por ele com um atributo de hit da arma do personagem ou do próprio personagem, como é feito na franquia *Fire Emblem*. Esse tipo de chance independe da defesa do oponente, que no caso, serve apenas para reduzir o dano.

#### **Alcance de dano**

Mecânica onde um tipo de ataque causa dano entre um valor mínimo e um valor máximo. Esse tipo de mecânica é extremamente comum em jogos de RPG, o que torna os combates mais dinâmicos e imprevisíveis.

#### **Geração de itens**

Um gerador de itens que podem possuir uma classificação diferente de onde eles vêm, podendo ser gerados no momento em que uma lootbox é aberta ou em uma localização de uma sala na qual o jogador acabou de entrar. Esse tipo de mecânica é comum em Roguelikes, que tem a presença de diversos itens aleatórios com efeitos distintos.

#### **Geração procedural**

Um geração aleatória via seeds que cria quantidades de elementos e tipos de elementos em um jogo. É muito presente na geração de terreno, localizações, NPCs e outros elementos que passam uma sensação mais orgânica para o jogador.

   Em um mapa, a geração procedural pode usar o *Ruído de Perlin* para criar valores de terreno aleatórios em cada coordenada espacial, podendo ter alcances numéricos diferentes para gerar espaços com dimensões variadas.

## **Referências**

History of uniform random number generation

Unity Scripting API: Random.Range

RandomNumberGenerator - Godot Docs

https://www.youtube.com/watch?v=-POwgollFeY

https://www.reddit.com/r/bindingofisaac/comments/3p5a03/rnjesus\_an\_introduction\_on\_how\_rngs\_are\_used\_and/

https://br.pinterest.com/pin/60446819983996758/

https://fallout.fandom.com/wiki/Vault-Tec\_Assisted\_Targeting\_System

https://stackoverflow.com/questions/11802213/simple-procedural-3d-cave-generation

https://se7en.ws/review-dicey-dungeons/?lang=en