No Elixir, para escolher um elemento aleatório de uma estrutura de dados enumerável (por exemplo, uma lista ou um intervalo), usamos Enum.random. Essa função escolhe um único elemento, e todos os elementos têm a mesma probabilidade de serem escolhidos.
O Elixir não tem funções próprias para escolher um número de ponto flutuante aleatório. Para isso, precisamos usar o Erlang diretamente.
O código Elixir roda na máquina virtual BEAM. A BEAM faz parte do Erlang Run-Time System. Inspirado no Erlang e compartilhando seu ambiente de execução, o Elixir oferece uma ótima interoperabilidade com as bibliotecas do Erlang. Isso significa que quem desenvolve em Elixir pode usar bibliotecas do Erlang dentro do seu código Elixir. Na verdade, a comunidade Elixir desencoraja escrever bibliotecas Elixir para funcionalidades que as bibliotecas do Erlang já oferecem.
Por isso, certas funcionalidades, como operações matemáticas ou funções de temporização, só estão disponíveis no Elixir por meio do Erlang.
A biblioteca padrão do Erlang pode ser usada no nosso código Elixir sem nenhum passo extra.
As funções do Erlang podem ser chamadas do mesmo jeito que chamamos as funções do Elixir, com uma pequena diferença. Os nomes dos módulos do Erlang são átomos em snake_case. Por exemplo, para chamar a função pi/0 do Erlang, do módulo math, você escreveria:
:math.pi()
# => 3.141592653589793
As funções do Erlang mais usadas que não têm equivalente no Elixir são:
:timer.sleep/1, que suspende um processo pela quantidade de milissegundos informada.:rand.uniform/0, que gera um número de ponto flutuante aleatório x, em que 0.0 <= x < 1.0.:io_lib.format/2, que oferece formatação de string no estilo C (usando sequências de controle). Com essa função, poderíamos, por exemplo, imprimir um número inteiro em qualquer base entre 2 e 36 ou formatar um número de ponto flutuante com a precisão desejada. Repare que essa função, como muitas funções do Erlang, retorna uma charlist.math, que oferece funções matemáticas como sin/1, cos/1, log2/1, log10/1, pow/2 e outras.Para conhecer a biblioteca padrão do Erlang, explore o STDLIB Reference Manual.
A Mary é uma grande fã da série de TV Star Trek: The Next Generation. Ela costuma jogar RPG de mesa, em que ela e seus amigos fingem ser a tripulação da Starship Enterprise. A personagem da Mary é o Capitão Picard, o que significa que ela precisa manter o diário do capitão. Ela adora a parte criativa do jogo, mas não gosta de gerar dados aleatórios na hora.
Ajude a Mary criando geradores aleatórios para os dados que aparecem com frequência no diário do capitão.
A Starship Enterprise encontra muitos planetas em suas viagens. No universo de Star Trek, os planetas são divididos em categorias com base em suas propriedades. Por exemplo, a Terra é um planeta de classe M. Todas as classes planetárias possíveis são: D, H, J, K, L, M, N, R, T e Y.
Implemente a função random_planet_class/0. Ela deve retornar uma das classes planetárias aleatoriamente.
CaptainsLog.random_planet_class()
# => "K"
A Enterprise (número de registro NCC-1701) não é a única nave espacial voando por aí! Quando ela se encontra com outra nave espacial, a Mary precisa anotar no diário o número de registro dessa nave.
Os números de registro começam com o prefixo "NCC-" e depois usam um número de 1000 a 9999 (inclusive).
Implemente a função random_ship_registry_number/0, que retorna um número de registro de nave espacial aleatório.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
De que serve um diário se ele não inclui datas?
Uma data estelar é um número de ponto flutuante. As aventuras da Starship Enterprise na primeira temporada de The Next Generation acontecem entre as datas estelares 41000.0 e 42000.0. O "4" representa o século 24, e o "1" representa a primeira temporada.
Implemente a função random_stardate/0, que retorna um número de ponto flutuante entre 41000.0 (inclusive) e 42000.0 (exclusive).
A implementação deve usar uma função do Erlang.
CaptainsLog.random_stardate()
# => 41458.15721310934
No diário do capitão, as datas estelares geralmente são arredondadas para uma casa decimal.
Implemente a função format_stardate/1, que recebe um número de ponto flutuante e retorna uma string com o número arredondado para uma casa decimal.
A implementação deve usar uma função do Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.