Після тижнів очікування ми з друзями збираємося на свою найпершу гру в Dungeons & Dragons (D&D). Оскільки це перша сесія гри, кожен гравець має згенерувати персонажа, яким гратиме. Характеристики персонажа визначаються кидками шестигранних кубиків, але де ж взяти кубики? З жахом ми розуміємо, що друзі чекають, коли кубики дістанемо саме ми; зрештою, пограти в D&D була наша ідея! Панікуючи, ми розуміємо, що забули взяти кубики, а це означало б, що гри в D&D не буде. Оскільки ми маємо базові навички програмування, ми швидко знаходимо рішення: напишемо програму, яка імітує кидки кубиків.
Для гри в Dungeons & Dragons кожен гравець починає зі створення персонажа, яким можна грати. Цей персонаж має, серед іншого, шість характеристик: силу, спритність, статуру, інтелект, мудрість і харизму. Значення цих шести характеристик визначаються випадково. Для цього ми кидаємо чотири шестигранні кубики й записуємо суму трьох найбільших. Робимо це шість разів, по одному разу для кожної характеристики.
Початкові хіти персонажа дорівнюють 10 + модифікатор статури персонажа. Модифікатор статури персонажа ми знаходимо так: віднімаємо 10 від статури персонажа, ділимо на 2 і округлюємо вниз.
Напишіть генератор випадкових персонажів, який дотримується наведених вище правил.
Наприклад, шість кидків чотирьох кубиків можуть мати такий вигляд:
Оскільки статура дорівнює 3, модифікатор статури становить -4, а хіти дорівнюють 6.
Більшість мов програмування мають (псевдо)випадкові генератори, але мало які мови програмування призначені для кидання кубиків. Одна з таких мов - Troll.
Стандартна бібліотека Zig уникає прихованого глобального стану, тож замість того, щоб тримати власний генератор випадкових чисел, функції отримують інтерфейс std.Random, з якого беруть значення.
Тести передають генератор із початковим значенням std.testing.random_seed і перевіряють, що генератори з однаковим початковим значенням дають однакові символи.
Розподіл значень характеристик перевіряють за допомогою критеріїв хі-квадрат на рівні значущості p < 0.0001:
ability, порівнюють з очікуваним розподілом;Правильна реалізація має менш ніж 0,01 % імовірності не пройти кожен із тестів.
Що таке характеристика, описано в інструкціях вище.
Зареєструйтеся на Exercism, щоб вивчати й опановувати Zig, а також 104 вправи та справжнє наставництво від людей, і все це безкоштовно.
Ми розглянемо, як генерувати (начебто) випадкові кидки кубиків. Дізнаємося про зерна, псевдовипадкові числа та кілька типових пасток. Нарешті, побачимо, чим тестування на основі властивостей добре підходить для перевірки функцій, що повертають випадкові значення.