MOCHET [7] 
03.10.2019 15:40
 0просмотров 0 0

Cooldown - ru

Ситуация такая: мы выкинули карту, через минимум сколько ходов она придёт к одному или другому игроку на руки? И есть ли некий максимум "не-выхода" карты - может ли карта не выходить 100, 200, 400, 1000, ... ходов ?

Итак, я провёл несколько длительных экспериментов, чтобы получить ответ на этот вопрос. При экспериментов были доступны данные о моих картах и картах противника во время каждого хода (какая карта вышла и какая пришла). Любые запросы/ответы протоколлировались через программу fiddler (перехватчик HTTP запросов) и позже обрабатывались скриптом (statistical language R). Напомню: в колоде у нас 102 карты (ID: 0...101).

У нас есть 3 варианта:

1). 7 против 7 карт
2). 7 против 6 карт
3). 6 против 6 карт

Пример: У меня 7 карт, а у противника 6 карт. Скидываем карту:

I). Первый вопрос:

Через мин. сколько ходов придёт снова карта мне/врагу? (минимальный cooldown)

II). Второй вопрос:

Есть ли верхняя граница "не-получения" карты, то есть может ли карта не выходить подолгу, например 200 ходов?


I). Мин.количество ходов "не-выхода" карты:

1). (102 карты - (7+7))/2 = 88/2 = 44 -> cooldown у сброшенной карты минимум 44 хода.
3). (102 карты - (6+6))/2 = 90/2 = 45 -> cooldown у сброшенной карты минимум 45 ходов.
Теперь интересный случай: 6 против 7:
2). (102 карты - (6+7))/2 = 89/2 = 44.5 -> округление идёт вверх или вниз?
Сделал длительный эксперимент (скидывал карты несколько часов). При втором варианте идёт округление вверх, т.е. cooldown 45 ходов.


II). Есть ли верхняя граница по "не-выпаданию" карты?

Карты могут не выходить по 200, 400 и более ходов. Но вероятность того, что карта будет очень долго не выходить становится крайне мало.

Скрин из анализа эксперимента

X: "сколько ходов не выпадала карта": turns
Y: "сколько раз происходило данное событие": frequency

На графике видно, что в большинстве случаев карта обязательно выходит где-то после 45-150 ходов. Скорее всего механизм такой: Скидываем карту, она попадает во вторую часть колоды (в радомное место). После этого скидываем ещё одну карту, но она может отодвинуть карту до этого, т.е. может получиться, что мы будет постоянно отодвигать одну и ту же карту не давая ей шанс выйти на руки. Если мы будем играть 10.000 ходов (После этой игры максимальное количество ходов стало 2500), то может получится, что одна будет не выходить 1.000 ходов, но исходя из данных наблюдаемых в эксперименте вероятность такого события крайне мала.

Формула

Вероятность того, что определённая карта не выйдет из общего котла X ходов: ((44/45)^Х) * 100% [1] Т.е. будут выходить 44 другие, но не она.
где Х это количество ходов
чем больше Х, тем меньше вероятность, что карта останется ещё дольше. Но бывают и случаи, когда бывает что карта не выходит и по 100 или 200 и более ходов. Но случается такое редко.

Данные по формуле [1]:


Статистические данные очень схожы с данными рассчитаными по формуле.
В статистических данных у нас частота явлений, а в данных по формуле вероятность.
Чтобы переделать количество явлений (frequency) в вероятность (probability), нужно посчитать сумму всех явлений: N (должно быть меньше чем лимит ходов, т.е. 2500) и делить явления на это число N.

Пример:
Событие: 44 хода не выходила карта (любая)
Это событие было 60 раз

Всего например 2400 собранных явлений
60/2400*100% = 2.50% вероятность того, что карта выйдет из кулдауна и срау попадёт кому-то на руки
По формуле: (1-(44/45)^1)*100 = 2.22%



Если описать PHP кодом, то будет примерно вот так:

// здесь сидят карты
$cooldown_array = array(3, 7, 9, 42, 101, ...);
// отсюда вытягиваются карты
$pool_array = array(99, 0, 5, 6, 8, 102, ...);

// у первого игрока 6 карт
$cards_player_1 = 6;
// у второго игрока 7 карт
$cards_player_7 = 7;

// 44/45 ходов кулдаун
$cooldown = ceil((102 - ($cards_player_1 + $cards_player_7)) / 2);

/* Игрок играет картой и получает новую */

// карта с номером 42 будет сидеть 44/45 ходов в этом массиве
$cooldown_array[] = 42;

if(sizeof($cooldown_array) === $cooldown - 1){
    // получаем карту, которую засунули 44/45 ходов назад
    $card = array_shift($cooldown_array);
    // добавляем карту в массив. она готова для выхода в мир
    $pool_array[] = $card;
}

// получаем новую карту и даём игроку
$card_id = $pool_array[mt_rand(0, count($pool_array ) - 1)]];
// убираем карту из массива $pool_array
...

Возможность комментировать доступна после регистрации