En Elixir, para elegir un elemento aleatorio de una estructura de datos enumerable (por ejemplo, una lista o un rango), usamos Enum.random. Esta función elige un solo elemento, y cada elemento tiene la misma probabilidad de ser elegido.
Elixir no tiene funciones propias para elegir un número de punto flotante aleatorio. Para lograrlo, tenemos que usar Erlang directamente.
El código de Elixir se ejecuta en la máquina virtual BEAM. BEAM forma parte del sistema de ejecución de Erlang. Inspirado por Erlang y compartiendo su entorno de ejecución, Elixir ofrece una gran interoperabilidad con las bibliotecas de Erlang. Esto significa que puedes usar bibliotecas de Erlang dentro de tu propio código de Elixir. De hecho, en la comunidad de Elixir se desaconseja escribir bibliotecas de Elixir para funcionalidades que las bibliotecas de Erlang ya ofrecen.
Como resultado, cierta funcionalidad, como las operaciones matemáticas o las funciones de temporizador, solo está disponible en Elixir a través de Erlang.
La biblioteca estándar de Erlang está disponible para usarse en nuestro código de Elixir sin necesidad de pasos adicionales.
Las funciones de Erlang se pueden llamar de la misma manera en que llamamos a las funciones de Elixir, con una pequeña diferencia. Los nombres de los módulos de Erlang son átomos en snake_case. Por ejemplo, para llamar a la función pi/0 de Erlang desde el módulo math, se escribiría:
:math.pi()
# => 3.141592653589793
Las funciones de Erlang que se usan con más frecuencia y que no tienen un equivalente en Elixir son:
:timer.sleep/1, que suspende un proceso durante la cantidad de milisegundos indicada.:rand.uniform/0, que genera un número de punto flotante aleatorio x, donde 0.0 <= x < 1.0.:io_lib.format/2, que ofrece formato de string al estilo de C (usando secuencias de control). Con esta función, por ejemplo, podríamos imprimir un número entero en cualquier base entre 2 y 36 o dar formato a un número de punto flotante con la precisión deseada. Ten en cuenta que esta función, como muchas funciones de Erlang, devuelve un charlist.math, que ofrece funciones matemáticas como sin/1, cos/1, log2/1, log10/1, pow/2, y más.Para descubrir la biblioteca estándar de Erlang, explora el manual de referencia de STDLIB.
Mary es muy fan de la serie de televisión Star Trek: The Next Generation. A menudo juega juegos de rol de lápiz y papel, en los que ella y sus amigos se hacen pasar por la tripulación de la Starship Enterprise. El personaje de Mary es el capitán Picard, lo que significa que tiene que llevar el diario del capitán. Le encanta la parte creativa del juego, pero no le gusta generar datos aleatorios sobre la marcha.
Ayuda a Mary creando generadores aleatorios para los datos que aparecen habitualmente en el diario del capitán.
La Starship Enterprise se encuentra con muchos planetas en sus viajes. Los planetas del universo de Star Trek se dividen en categorías según sus propiedades. Por ejemplo, la Tierra es un planeta de clase M. Todas las clases planetarias posibles son: D, H, J, K, L, M, N, R, T y Y.
Implementa la función random_planet_class/0. Debe devolver una de las clases planetarias al azar.
CaptainsLog.random_planet_class()
# => "K"
¡La Enterprise (número de registro NCC-1701) no es la única nave estelar que anda por ahí! Cuando se encuentra con otra nave estelar, Mary necesita registrar el número de registro de esa nave.
Los números de registro empiezan con el prefijo «NCC-» y luego usan un número del 1000 al 9999 (ambos incluidos).
Implementa la función random_ship_registry_number/0 que devuelve un número de registro de nave estelar al azar.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
¿De qué sirve un diario si no incluye fechas?
Una fecha estelar es un número de punto flotante. Las aventuras de la Starship Enterprise de la primera temporada de The Next Generation transcurren entre las fechas estelares 41000.0 y 42000.0. El «4» representa el siglo XXIV y el «1», la primera temporada.
Implementa la función random_stardate/0 que devuelve un número de punto flotante entre 41000.0 (incluido) y 42000.0 (excluido).
La implementación debe usar una función de Erlang.
CaptainsLog.random_stardate()
# => 41458.15721310934
En el diario del capitán, las fechas estelares suelen redondearse a un solo decimal.
Implementa la función format_stardate/1 que toma un número de punto flotante y devuelve un string con el número redondeado a un solo decimal.
La implementación debe usar una función de Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.