Pokemon ORAS DexNav Shiny Encounter Анализ вероятности

Контент

Многие люди размышляли о вероятностях найти блестящего покемона с помощью dexnav на pokemon ORAS, но на самом деле мы не знаем, каковы вероятности. Некоторый анализ, основанный на реальных встречах, дал некоторые результаты, заставившие нас задуматься о вероятности 1/200 или 1/300, но это меня не совсем убедило. Поэтому я решил провести несколько исследований о реальных вероятностях и о том, как игра решает, блестящий покемон или нет.

Как покемон считается блестящим?

Мы знаем, что у каждого покемона есть определенный PID, который генерируется случайным образом при генерации самого покемона. PID - это 32-битное значение, и покемон блестит, если (TID xor SID xor PID_high xor PID_low)
Мы знаем, что игра может увеличить вероятность с помощью блестящего чарма, она вычисляет в три раза больше PID, если сгенерированный не является «блестящим». Мы можем думать, что dexnav делает нечто подобное, увеличивая количество вычислений PID, но вопреки тому, что мы думаем, «подсчет вычислений» такой же, как и при нормальной встрече.

Как dexnav может увеличить вероятность?

Я исследовал, как dexnav генерирует покемона, и, прежде чем делать что-либо с PID, он генерирует некоторую базовую информацию, которую мы можем видеть на нижнем экране, когда мы используем dexnav, например, уровень покемона, id. Эта информация генерируется и сохраняется в памяти до того, как будет сгенерирован покемон, и, проанализировав их, я только что обнаружил, что эта информация содержит логическое значение для блеска покемона. Когда это значение установлено на 1, покемон автоматически сияет, а когда оно установлено на 0, то вычисление PID выполняется, как и для любого обычного столкновения.

Итак, мы можем представить себе такую ​​диаграмму дерева вероятностей:

Какова вероятность того, что это значение установлено на 1?

После некоторых исследований я обнаружил алгоритм, используемый во время генерации, чтобы определить, является ли это значение 1 или 0. Это полностью отличается от цикла генерации и вычислений PID. Сначала игра вычисляет случайное 16-битное целое число от 0 (включено) до 10000 (исключено), то есть 10000 потенциальных значений. Затем это значение сравнивается с другим, вычисленным ранее (не случайным), и если случайное значение является наименьшим, то покемон блестит.

По сути, он делает что-то вроде этого: if random_value
Посмотрев, как рассчитывается другое значение, я быстро обнаружил, что оно основано на уровне поиска текущего покемона, и вот как оно вычисляется:

Теперь мы знаем, как вычислить другое значение, но на самом деле, как и при вычислении PID, случайное значение и сравнение могут выполняться несколько раз.

Теперь я буду использовать термины dexnav_level вместо «другое значение» и «dexnav_random» вместо «случайное значение». Таким образом, как и при вычислении PID, цикл обычно повторяется один раз без чарма и три раза с чармом, но мы можем заметить, что даже если условие выполнено, цикл не прерывается. Таким образом, вы потенциально можете получить сразу несколько «блестящих значений» (это бессмысленно).

Исследуя, что может изменить количество итераций, я обнаружил, что если покемон будет 50-м в вашей цепочке dexnav, цикл будет повторяться еще 5 раз, а если он будет 100-м, то цикл будет повторяться еще 10 раз, поэтому назовем это chain_bonus. Пусть n будет числом

повторений цикла, мы имеем: n = 1 + charm_bonus + chain_bonus

с charm_bonus = 0 без чарма и 2 с чармом.

Теперь мы можем иметь дело с вероятностями. Пусть C будет событием: «условие выполнено». Поскольку dexnav_random является целым числом, а dexnav_level - значением с плавающей запятой,

если dexnav_random
P (C) = ceil (dexnav_level) / 10000

Итак, теперь мы можем вычислить вероятность C. Итак, пусть D будет событием: «логическое значение dexnav установлено на 1 (покемон сияет из-за dexnav)». D реализуется только в том случае, если C реализуется хотя бы один раз за несколько итераций цикла.

У нас есть эксперимент Бернулли, успешный: C реализован, а неудачный: C не реализован. Мы повторяем этот эксперимент n раз и подсчитываем количество успехов X. Мы хотим знать вероятность того, что C реализуется хотя бы один раз, поэтому:

Таким образом, теперь мы можем определить вероятность того, что покемон станет сияющим во время процесса генерации dexnav, но не забывайте наше начальное дерево вероятностей, даже если покемон не настроен блестящим здесь, он все равно может быть блестящим из-за случайное вычисление PID.

Окончательная вероятность

Нам нужно знать вероятность того, что в любом случае будет блестящий PID. Без блестящего шарма у нас есть хорошо известный 1/4096, но с шармом PID вычисляется 3 раза, и цикл прерывается, если происходит успех (когда мы получаем блестящий PID). Это похоже на предыдущую ситуацию, но теперь процесс можно прервать, мы повторяем до 3 раз и останавливаемся, если происходит успех. Это можно проиллюстрировать этим деревом (3 итерации):

У нас есть X - шаг, на котором происходит успех, и мы считаем, что X = 0, если успех не происходит, так что мы находимся в случае усеченного геометрического закона. Как и в предыдущей ситуации, мы имеем:

P (X>= 1) = 1 - P (X = 0)

и

P (X = 0) = pow (4095/4096, n1),

где n1 - количество итераций, поэтому, наконец, :

P (X>= 1) = 1 - pow (4095/4096, n1)

у нас есть вероятность блестящего PID в любом случае.

/! \ Некоторые люди говорят, что вероятность с блестящим оберегом составляет 3/4096 ПОТОМУ ЧТО мы вычисляем PID 3 раза, поэтому вероятность умножается на 3. Это НЕПРАВИЛЬНО, на самом деле это примерно 3/4096, но это не потому, что вы повторить 3 раза эксперимент, умножив вероятность на 3. /! \

Итак, наконец, мы знаем все вероятности, необходимые для вычисления окончательного P (S):

P (S) = P (D ∩ S) + P (! D ∩ S), а затем:

P (S) = (1 - pow ( 1-P (C), n)) * 1 + (1 - (1 - pow (1-P (C), n)) * (1 - pow (4095/4096, n1)), поэтому мы имеем:

P ( S) = 1 - pow (1-P (C), n) + pow (1-P (C), n) * (1 - pow (4095/4096, n1))

Таинственная ценность (почему я ошибался)

Мы знаем, как вычислить P (S), но я пропустил значение в алгоритме, которое после многих тестов казалось постоянно равным 0. Но на самом деле оно не всегда равно 0, и когда оно равно 1, то n увеличивается на 4, так что еще 4 итерации для цикла dexnav. Чтобы решить, установлено ли это значение на 1 или 0, игра вычисляет случайное 16-битное значение от 0 (включено) до 100 (исключено), и если случайное значение меньше 4, то это конкретное логическое значение устанавливается на 1. Так что в основном это делает:

if (random,

где random_bonus - логическое значение.

Итак, это новое дерево:

С B событие: «применен случайный бонус». Итак, теперь у нас есть:

И n вычисляется так:

Вывод

Теперь мы можем узнать, какова вероятность найти блестящего покемона, исходя из уровня поиска, цепи и блестящего оберега. Если вы обнаружите ошибку, пожалуйста, откройте проблему в соответствующем репозитории github :). Я быстро реализовал небольшой калькулятор, см .: Блестящий калькулятор 6-го поколения

Если вы мне не доверяете, посмотрите соответствующую часть разборки из двоичных файлов игры: ДОКАЗАТЕЛЬСТВО