Цитата:
«выбираемый вторичный навык будет таким же, как если бы мы заменили выпавшую грань 201-гранного «кубика» остатком от деления её на сумму весов навыков-кандидатов, с одним лишь отличием: если остаток оказывается равным 0, выбирается последний навык из списка, а не первый».
не учитывает одну маленькую деталь.
Цитата:
Дело оказалось в том, что когда выпадает грань 0 (довольно редкий случай), вес первого же навыка-кандидата при вычитании делает разность отрицательной. Однако, согласно более эффективному подходу, в этом случае следует выбирать последний навык из списка навыков-кандидатов, т.к. остаток от деления нуля есть нуль.
Рассмотрим ещё раз пример из статьи "Первичные и вторичные навыки"
Пусть теперь выпала грань 22.
Шаг 1
22 — 3 = 19 (вычли вес Logistics)
19 — 4 = 15 (вычли вес Scouting)
15 — 2 = 13 (вычли вес Diplomacy)
13 — 3 = 10 (вычли вес Navigation)
10 — 1 = 9 (вычли вес Wisdom)
9 — 1 = 8 (вычли вес Mysticism)
8 — 1 = 7 (вычли вес Eagle Eye)
7 — 2 = 5 (вычли вес Estates)
Список навыков кончился, начинаем отнимать снова с начала списка:
Шаг 2
5 — 3 = 2 (вычли вес Logistics)
2 — 4 = -2 (вычли вес Scouting)
Здесь сумма весов навыков-кандидатов равна 3 + 4 + 2 + 3 + 1 + 1 + 1 + 2 = 17, поэтому выпавшую грань 22 можно заменить на остаток от деления её на 17. Другими словами, мы сразу же переходим к шагу 2, пропуская шаг 1, чем существенно экономим на вычислениях. Если вместо грани 22 выпала бы грань 17, остаток оказался бы равен нулю, и мы, согласно оговорке "с одним лишь отличием...", выбрали бы последний навык из списка кандидатов, а не первый. Почему так? Смотрите сами:
17 - 3 = 14 (вычли вес Logistics)
14 - 4 = 10 (вычли вес Scouting)
10 - 2 = 8 (вычли вес Diplomacy)
8 - 3 = 5 (вычли вес Navigation)
5 - 1 = 4 (вычли вес Wisdom)
4 - 1 = 3 (вычли вес Mysticism)
3 - 1 = 2 (вычли вес Eagle Eye)
2 - 2 = 0 (вычли вес Estates)
При вычитании веса последнего навыка получили неположительное число, поэтому именно последний навык (Estates) выбирается в слот. Если заменить выпавшую грань игральной кости на остаток от деления её на сумму весов навыков-кандидатов, мы бы получили следующее:
0 - 3 = -3 (вычли вес Logistics)
и без оговорки должны были бы выбрать первый навык, что привело бы к ошибке. Теперь самое интересное Рассмотрим случай, когда выпадает грань 0. Мы по-прежнему имеем:
0 - 3 = -3 (вычли вес Logistics),
т.е. в слот отправляется Логистика, но, т.к. 0 mod 17 = 0, то программа вместо первого навыка отправляет в слот последний, что и приводит к ошибке.
* * *
Дима, замени, пожалуйста, в статье фразу
Цитата:
на
Цитата:
P. S. Соответствующие исправления будут внесены в LM Oracle.