في Elixir، لاختيار عنصر عشوائي من بنية بيانات قابلة للتعداد (مثل مصفوفة أو نطاق)، نستخدم Enum.random. ستختار هذه الدالة عنصرًا واحدًا، مع تساوي احتمال اختيار كل عنصر.
لا توفر Elixir دوال خاصة بها لاختيار عدد عشري عشوائي. للقيام بذلك، علينا استخدام Erlang مباشرة.
يعمل كود Elixir داخل الآلة الافتراضية BEAM. وBEAM جزء من نظام زمن التشغيل الخاص بـ Erlang. ولأن Elixir مستوحاة من Erlang وتتشارك معها بيئة التشغيل، فإنها توفر توافقًا تشغيليًا ممتازًا مع مكتبات Erlang. وهذا يعني أن مطوري Elixir يمكنهم استخدام مكتبات Erlang من داخل كود Elixir الخاص بهم. بل إن مجتمع Elixir لا يشجع على كتابة مكتبات Elixir لوظائف توفرها مكتبات Erlang بالفعل.
ونتيجة لذلك، فإن بعض الإمكانات، مثل العمليات الحسابية أو دوال المؤقتات، لا تتوفر في Elixir إلا عبر Erlang.
مكتبة Erlang القياسية متاحة للاستخدام في كود Elixir دون أي خطوات إضافية.
يمكن استدعاء دوال Erlang بالطريقة نفسها التي نستدعي بها دوال Elixir، مع فرق صغير واحد. أسماء وحدات Erlang هي ذرات بنمط snake_case. على سبيل المثال، لاستدعاء الدالة pi/0 من الوحدة math في Erlang، نكتب:
:math.pi()
# => 3.141592653589793
أكثر دوال Erlang استخدامًا والتي ليس لها مقابل في Elixir هي:
:timer.sleep/1 التي توقف عملية لمدة عدد معين من المللي ثانية.:rand.uniform/0 التي تولّد عددًا عشريًا عشوائيًا x، حيث 0.0 <= x < 1.0.:io_lib.format/2 التي توفر تنسيق السلاسل النصية على طريقة C (باستخدام متتاليات تحكم). باستخدام هذه الدالة، يمكننا مثلًا طباعة عدد صحيح في أي أساس بين 2 و36 أو تنسيق عدد عشري بالدقة المطلوبة. لاحظ أن هذه الدالة، مثل كثير من دوال Erlang، تُرجع charlist.math التي توفر دوالًا حسابية مثل sin/1 وcos/1 وlog2/1 وlog10/1 وpow/2 وغيرها.لاستكشاف مكتبة Erlang القياسية، تصفّح الدليل المرجعي STDLIB.
ماري من أشدّ المعجبات بالمسلسل التلفزيوني Star Trek: The Next Generation. غالبًا ما تلعب ألعاب تقمّص الأدوار الورقية، حيث تتظاهر هي وأصدقاؤها بأنهم طاقم السفينة Starship Enterprise. شخصية ماري هي الكابتن بيكارد، ما يعني أنه عليها الاحتفاظ بسجل القبطان. تحب الجزء الإبداعي من اللعبة، لكنها لا تحب توليد بيانات عشوائية على الفور.
ساعد ماري بإنشاء مولّدات عشوائية للبيانات التي تظهر كثيرًا في سجل القبطان.
تصادف السفينة Starship Enterprise كواكب كثيرة في رحلاتها. تُقسَّم الكواكب في عالم Star Trek إلى فئات بناءً على خصائصها. فعلى سبيل المثال، الأرض كوكب من الفئة M. جميع فئات الكواكب الممكنة هي: D، H، J، K، L، M، N، R، T وY.
نفّذ الدالة random_planet_class/0. يجب أن تُرجع إحدى فئات الكواكب عشوائيًا.
CaptainsLog.random_planet_class()
# => "K"
ليست Enterprise (رقم التسجيل NCC-1701) السفينة الفضائية الوحيدة التي تحلّق في الأرجاء! وعندما تلتقي بسفينة فضائية أخرى، تحتاج ماري إلى تدوين رقم تسجيل تلك السفينة.
تبدأ أرقام التسجيل بالبادئة "NCC-" ثم رقم من 1000 إلى 9999 (شاملًا).
نفّذ الدالة random_ship_registry_number/0 التي تُرجع رقم تسجيل عشوائيًا لسفينة فضائية.
CaptainsLog.random_ship_registry_number()
# => "NCC-1947"
وما فائدة سجل لا يتضمّن تواريخ؟
التاريخ النجمي عدد عشري. تدور أحداث مغامرات Starship Enterprise في الموسم الأول من The Next Generation بين التاريخين النجميين 41000.0 و42000.0. الرقم "4" يرمز إلى القرن الرابع والعشرين، والرقم "1" إلى الموسم الأول.
نفّذ الدالة random_stardate/0 التي تُرجع عددًا عشريًا بين 41000.0 (شاملًا) و42000.0 (غير شامل).
يجب أن يستخدم التنفيذ دالة من Erlang.
CaptainsLog.random_stardate()
# => 41458.15721310934
في سجل القبطان، عادةً ما تُقرَّب التواريخ النجمية إلى منزلة عشرية واحدة.
نفّذ الدالة format_stardate/1 التي تأخذ عددًا عشريًا وتُرجع سلسلة نصية تحتوي العدد مقرَّبًا إلى منزلة عشرية واحدة.
يجب أن يستخدم التنفيذ دالة من Erlang.
CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.