MOCHET [7] 
19.07.2018 03:11
 0просмотров 14 0

Вероятность выхода карты. Pool+Cooldown


Имеем: 102 карты
У меня и у тебя по 6. Значит в сумме 12 (6+6)
102-12=90 карт остаётся
Делим пополам (две колоды в механике): 90/2 = 45
45 кулдаун, там сидит карта 45 ходов и не может выйти. Выйдет только через 45.
Через 45 ходов карта попадает в общий котёл (pool), где рандомно выбирается карта и попадает в руки игроку, который только что сыграл какой-то другой картой.

Как всегда одна колода.

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

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


Данные собранные во время игры (карты обоих игроков был известны; 2500 ходов):


Данные из 13 игр, по 2500 ходов каждая (был баг в обработке - его пофиксил. чтобы не переделывать график, просто убрал забагованное место в графике):

X = turns (сколько ходов не появлялась карта)
Y = frequency (как часто было это событие?)

На самом деле просто куча боксплотов в одной картинке.



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

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

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



Либо если формулу немного переделать (1-(44/45)^X) * 100% [2]
Чем дольше карта не выходит, тем больше вероятность, что карта выйдет в следующем ходу.

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


formula
1-((44/45)^X) = sum(frequency_i/sum(all frequencies))
1-((44/45)^4) = 0.08596958

statistical data
n = sum(all frequencies) = 2410
sum(frequency_i/n) = 0.02406639+0.0186722+0.02033195+0.01825726 = 0.0813278



code

import csv
import collections

csv_file = "data.csv"
data = []
cards_on_hands = []
cards_last_seen = [0] * 102
diffs = []

with open(csv_file) as f:
    csv_reader = csv.reader(f)
    data = [r for r in csv_reader]

c_done = False
b_done = False

# collect initial cards
for row in data:
    # ['1', '6', '71', '0', 'turn', '6-54-37-94-82-96', '71-54-37-94-82-96', 'c']
    if row[7] == "c" and not c_done:
        cards_on_hands += map(int, row[5].split("-"))
        c_done = True
    elif row[7] == "b" and not b_done:
        cards_on_hands += map(int, row[5].split("-"))
        b_done = True
    if c_done and b_done:
        break

for row in data:
    
    turn_now = int(row[0]) # current turn
    c_out    = int(row[1]) # card we play now
    c_in     = int(row[2]) # new card we get after we play c_out
    
    # end game
    if c_in == -1:
        break
    
    # update last seen timer for my cards (c_out inclusive)
    for c in cards_on_hands:
        cards_last_seen[c] = turn_now
    
    # replace old card with new one on hands
    position = cards_on_hands.index(c_out)
    cards_on_hands[position] = c_in
    
    # when was c_in seen last time?
    c_in_seen_last = cards_last_seen[c_in]
    
    if c_in_seen_last != 0:
        diffs.append(turn_now - c_in_seen_last)

d = sorted(diffs)
counter=collections.Counter(d)

for num, freq in zip(counter.keys(), counter.values()):
    print "%s\t%s" % (num, freq)


sample data

1,6,71,0,turn,6-54-37-94-82-96,71-54-37-94-82-96,c
2,69,21,0,drop,69-61-48-43-24-60,21-61-48-43-24-60,b
3,71,65,0,drop,71-54-37-94-82-96,65-54-37-94-82-96,c
...


processed data

cardAppeardAfterNturns frequency
45 58
46 45
47 49
48 44
49 45
50 49
51 40
52 41
53 44
54 41
55 47
56 39
57 41
58 31
59 45
60 46
61 41
62 33
63 37
64 43
65 35
66 29
67 29
68 35
69 29
70 35
71 39
72 23
73 39
74 25
75 23
76 31
77 20
78 19
79 24
80 23
81 27
82 21
83 17
84 30
85 23
86 16
87 19
88 23
89 16
90 23
91 23
92 19
93 21
94 17
95 21
96 11
97 19
98 20
99 14
100 27
101 14
102 21
103 10
104 15
105 13
106 12
107 17
108 15
109 14
110 9
111 10
112 13
113 11
114 13
115 14
116 13
117 11
118 19
119 8
120 7
121 10
122 7
123 5
124 10
125 8
126 10
127 10
128 9
129 11
130 6
131 8
132 8
133 7
134 10
135 8
136 6
137 11
138 6
139 9
140 5
141 8
142 5
143 6
144 5
145 6
146 7
147 5
148 5
149 8
150 3
151 1
152 4
153 3
154 2
155 3
156 4
157 10
159 4
160 4
161 3
162 2
163 3
164 2
165 2
166 4
167 1
168 1
169 3
170 4
171 2
172 2
173 5
174 1
175 4
176 3
177 3
178 1
179 3
180 2
181 1
182 2
183 2
184 3
185 4
186 5
187 3
188 2
189 5
190 4
193 3
194 1
195 2
197 2
198 2
199 1
200 2
201 2
202 1
203 4
206 3
207 1
208 1
210 2
211 2
212 1
213 3
214 1
215 1
216 2
217 2
219 1
220 2
222 2
223 2
225 2
226 1
229 2
230 1
231 1
233 2
234 1
236 1
239 2
242 1
248 1
249 1
250 1
255 1
258 1
259 1
266 2
267 1
272 1
277 3
282 1
285 1
286 1
293 1
294 1
295 1
296 1
297 1
299 1
307 1
319 1
320 1
335 1
370 1
432 1

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