Depois de semanas de expectativa, você e seus amigos se reúnem para a primeira partida de Dungeons & Dragons (D&D). Como esta é a primeira sessão do jogo, cada jogador precisa gerar um personagem para jogar. As habilidades do personagem são determinadas rolando dados de 6 lados, mas onde estão os dados? Com um susto, você percebe que seus amigos estão esperando que você produza os dados; afinal, foi sua ideia jogar D&D! Em pânico, você percebe que esqueceu de trazer os dados, o que significaria nenhuma partida de D&D. Como você tem algumas habilidades básicas de programação, rapidamente encontra uma solução: vai escrever um programa para simular rolagens de dados.
Em uma partida de Dungeons & Dragons, cada jogador começa gerando um personagem com o qual possa jogar. Esse personagem tem, entre outras coisas, seis atributos: Força, Destreza, Constituição, Inteligência, Sabedoria e Carisma. Esses seis atributos têm valores determinados aleatoriamente. Você faz isso rolando quatro dados de 6 lados e anotando a soma dos três maiores valores. Você faz isso seis vezes, uma vez para cada atributo.
Os pontos de vida iniciais do seu personagem são 10 + o modificador de Constituição dele. Você calcula o modificador de Constituição do seu personagem subtraindo 10 da Constituição dele, dividindo por 2 e arredondando para baixo.
Escreva um gerador aleatório de personagens que siga as regras acima.
Por exemplo, as seis rolagens de quatro dados podem ser assim:
Como a Constituição é 3, o modificador de Constituição é -4 e os pontos de vida são 6.
A maioria das linguagens de programação possui geradores (pseudo)aleatórios, mas poucas linguagens de programação são projetadas para rolar dados. Uma dessas linguagens é Troll.
A biblioteca padrão do Zig evita estado global oculto, então, em vez de você manter um gerador de números aleatórios próprio, suas funções recebem uma interface std.Random da qual extraem valores.
Os testes passam um gerador inicializado com std.testing.random_seed e verificam que geradores com a mesma semente produzem os mesmos personagens.
A distribuição dos seus valores de atributo é verificada por testes do qui-quadrado a um nível de significância de p < 0.0001:
ability são comparados com a distribuição esperada;Uma implementação correta tem menos de 0,01% de chance de falhar em cada teste.
Consulte as instruções acima para ver a definição do que é um valor de atributo.
Crie sua conta no Exercism para aprender e dominar Zig com 104 exercícios e mentoria humana de verdade, tudo de graça.
Vamos explorar como gerar rolagens de dados (aparentemente) aleatórias. Você vai aprender sobre sementes, números pseudoaleatórios e algumas armadilhas comuns. Por fim, vamos ver como o teste baseado em propriedades é ótimo para testar funções que retornam valores aleatórios.