En Elixir, pour choisir un élément au hasard dans une structure de données énumérable (par exemple un tableau, un intervalle), on utilise Enum.random. Cette fonction choisit un seul élément, chaque élément ayant la même probabilité d'être choisi.
Elixir ne dispose pas de ses propres fonctions pour choisir un nombre à virgule flottante au hasard. Pour cela, on doit utiliser Erlang directement.
Le code Elixir s'exécute dans la machine virtuelle BEAM. BEAM fait partie de l'Erlang Run-Time System. Inspiré par Erlang et partageant son environnement d'exécution, Elixir offre une excellente interopérabilité avec les bibliothèques Erlang. Cela signifie que les développeurs Elixir peuvent utiliser des bibliothèques Erlang depuis leur code Elixir. En fait, écrire des bibliothèques Elixir pour des fonctionnalités déjà fournies par les bibliothèques Erlang est déconseillé dans la communauté Elixir.
Par conséquent, certaines fonctionnalités, comme les opérations mathématiques ou les fonctions de minuterie, ne sont disponibles en Elixir que via Erlang.
La bibliothèque standard d'Erlang est utilisable dans notre code Elixir sans aucune étape supplémentaire.
On appelle les fonctions Erlang de la même manière que les fonctions Elixir, à une petite différence près. Les noms de modules Erlang sont des atomes en snake_case. Par exemple, pour appeler la fonction pi/0 Erlang du module math, on écrirait :
:math.pi()
# => 3.141592653589793
Les fonctions Erlang les plus couramment utilisées qui n'ont pas d'équivalent en Elixir sont :
:timer.sleep/1, qui suspend un processus pendant le nombre de millisecondes donné.:rand.uniform/0, qui génère un nombre à virgule flottante x au hasard, où 0.0 <= x < 1.0.:io_lib.format/2, qui fournit un formatage de string à la C (à l'aide de séquences de contrôle). Avec cette fonction, on pourrait par exemple afficher un entier dans n'importe quelle base entre 2 et 36, ou formater un nombre à virgule flottante avec la précision souhaitée. Note que cette fonction, comme beaucoup de fonctions Erlang, renvoie une charlist.math, qui fournit des fonctions mathématiques telles que sin/1, cos/1, log2/1, log10/1, pow/2, et bien d'autres.Pour découvrir la bibliothèque standard d'Erlang, explore le manuel de référence STDLIB.
Mary est une grande fan de la série Star Trek: The Next Generation. Elle joue souvent à des jeux de rôle sur papier, où elle et ses amis imaginent faire partie de l'équipage du Starship Enterprise. Le personnage de Mary est le capitaine Picard, ce qui signifie qu'elle doit tenir le journal de bord du capitaine. Elle adore la partie créative du jeu, mais n'aime pas devoir générer des données aléatoires à la volée.
Aide Mary en créant des générateurs aléatoires pour les données qui apparaissent couramment dans le journal de bord du capitaine.
Le Starship Enterprise rencontre de nombreuses planètes au cours de ses voyages. Dans l'univers de Star Trek, les planètes sont réparties en catégories selon leurs propriétés. Par exemple, la Terre est une planète de classe M. Toutes les classes planétaires possibles sont : D, H, J, K, L, M, N, R, T et Y.
Implémente la fonction random_planet_class/0. Elle doit renvoyer une des classes planétaires au hasard.
CaptainsLog.random_planet_class()
# => "K"
L'Enterprise (numéro d'immatriculation NCC-1701) n'est pas le seul vaisseau à parcourir l'espace ! Quand il croise un autre vaisseau, Mary doit consigner le numéro d'immatriculation de ce vaisseau.
Les numéros d'immatriculation commencent par le préfixe « NCC- », puis comportent un nombre de 1000 à 9999 (inclus).
Implémente la fonction random_ship_registry_number/0 qui renvoie un numéro d'immatriculation de vaisseau aléatoire.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
À quoi bon un journal de bord s'il ne contient pas de dates ?
Une stardate est un nombre à virgule flottante. Les aventures du Starship Enterprise de la première saison de The Next Generation se déroulent entre les stardates 41000.0 et 42000.0. Le « 4 » correspond au 24e siècle et le « 1 » à la première saison.
Implémente la fonction random_stardate/0 qui renvoie un nombre à virgule flottante entre 41000.0 (inclus) et 42000.0 (exclu).
L'implémentation doit utiliser une fonction Erlang.
CaptainsLog.random_stardate()
# => 41458.15721310934
Dans le journal de bord du capitaine, les stardates sont généralement arrondies à une seule décimale.
Implémente la fonction format_stardate/1 qui prend un nombre à virgule flottante et renvoie une string contenant le nombre arrondi à une seule décimale.
L'implémentation doit utiliser une fonction Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Inscris-toi sur Exercism pour apprendre et maîtriser Elixir avec 58 concepts168 exercices, et un vrai mentorat humain, le tout gratuitement.