Jump to content
Korean Random

SoprachevAK

User
  • Posts

    207
  • Joined

  • Last visited

  • Days Won

    9

Everything posted by SoprachevAK

  1. А это уже необычно, потому что дистанция большая, и из выборки в 190 выстрелов без сведения, в 20% разброса попало 174 снаряда, что весьма странно Потом изучу это ситуацию подробнее. Выглядит так, как будто реально тот самый баг, после выстрела разброс разбрасывается до 5, и потом записывается выстрел, который вылетел по старому разбросу, но судя по общему количеству выстрелов это единичные баги, которые тяжело повторить.
  2. На бета версии сведение серверного прицела записывалось не до, а после выстрела, а самый активный игрок бета версии, играл на арте. Если хочешь исключить старую версию добавляй фильтр режима боя и там выбирай стандартный, этот фильтр появился как раз после фикса со сведением На самом деле у арты распределение такое же как и у других танков. В нём всё ещё есть неточность расчёта, но она не такая большая.
  3. Ну на самом деле, если взять дистанцию подальше, и исключить САУ, то разница не столь велика https://wotstat.soprachev.com/analytics/61290b013177630799eecf73
  4. Ну пока что доказательств подкрути нет, как впрочем и железных опровержений
  5. Есть в xml <maxDistance> 720 </maxDistance>так что походу так и есть И насколько я понял есть ещё вот, но как xml связаны с питоном я не очень вникал
  6. Можно было бы тогда добавить предельное расстояние стрельбы как ттх пушки. Насколько я понимаю, сейчас это ограничение как то сделано, потому что ровно на 720 есть большой пик, зн ачит что то ограничивает расстояние до маркера 7 20 метрами. Просто это что то работает не всегда. В том числе и не на САУ Может это другие моды.
  7. Готово. Сейчас дистанция стрельбы это расстояние от пушки до маркера, тк координата попаданий не фиксируется, по этому, скорее всего, маркер можно навести дальше чем 720 метров, что конечно странно, ведь куда проще было бы ограничить расстояние дальномера 720 метрами
  8. Если ты про разброс, то он постоянный, если про сведение, то добавил "Сведение от расстояния" и "кол во выстрелов от расстояния" https://wotstat.soprachev.com/analytics/6127d64a3308c107bc7ace85
  9. Он у меня срабатывает в момент завершения боя ещё на карте этого боя (до ангара). И срабатывает только так, если выйти в ангар и ждать результаты боя не вызывается, если войти в другой бой тоже. Хотя был мод, который отображал результаты прошлого боя в новом бою, а сейчас вообще официально в клиенте есть, значит эта информация с сервера отправляется, но куда я не нашел
  10. Эти методы дают на выходе некое число, характеризующие качество случайности, ну и ожидается что это качество будет как минимум одинаковым у всех. Игроки ожидают случайное поведение рандома лично для себя, и именно его и стоит проверять.
  11. А ещё там на WGMods предложили поколлаборировать с другими модниками, так что какие есть предложения по этому поводу? Я думаю что можно добавить возможность другим модам устанавливать теги на события, и тогда можно будет строить графики в зависимости от тегов, что даст как минимум бесплатную аналитику модам. Например можно будет посмотреть с какой дистанции стреляют игроки с тегом "JOVEMODPACK" и сравнить со среднесервеным. На какую нибудь битву блоггеров было бы интересно кто сколько и как играет.
  12. Обновил шапку темы, релизнул на гитхаб основу новой версии. Можете глянуть на общую архитектуру и покритиковать её. А можете добавить новые события, по идеи это должно быть изи ту юз.
  13. Выглядит как будто бы да Вообще с увеличением количества выстрелов распределение становится весьма странной формы.
  14. Могу позволить, новая версия использует колоночную СУБД (увеличение количества столбцов не влияет на производительность) Спорно. Есть методы нуждающиеся в полной исходной последовательности. Тае же нашел свой университетский учебник, где 70 страниц посвящено анализу псевдослучайных последовательностей. Со 118 по 200 страницы, лично я в универе по нему делал тесты Кнута, крайне неприятное занятие, но может кому будет интересно глянуть Иванов М.А., Чугунков И.В._Теория, применение и оценка качества генераторов псевдослучайных последовательностей.pdf
  15. Они являются выстрелами, траекторию которых определил рандом. Если не учитывать часть выстрелов, в итоговом распределение получится ошибка выжившего. Понятное дело, что таких выстрелов мало, и на распределение они повлияют не сильно, но например на алгоритмы анализа случайных последовательностей, повлиять могут. Буду собирать и трассёры и точки попаданий если такие есть.
  16. Всё ок, всё работает. Думаю правильно, единственный вопрос остаётся, что делать с выстрелом в скайбокс или на расстояние дальше дистанции стрельбы Там нет ни взрыва ни урона Возможно такая ситуация будет ещё с выстрелом по незамеченному противнику, там вроде бы снаряд просто пропадает, но ещё не тестил Вообще я немного сомневаюсь в использование такого способа, он конечно точнее с точки зрения механик, однако получаются разные способ расчёта для разных типов попаданий Например попадание по танку может отправляться более точно, чем по рельефу, и получится что точность попаданий будет отличаться от точности промахов, а это нехилый камень в огород отсутствия подкрутки Я конечно буду собирать всё и можно будет сравнить, но как показывает практика, если не решить сразу, не решится никогда
  17. Думаю тут всё ещё мало выстрелов, как показали мои эксперименты, среднее для 100 выстрелов может колебаться от 0.36 до 0.43 (погрешность = 7%) для 1000 не пробовал, но допустим в 10 раз меньше, стало быть 0.7% и тогда внутри РУ сервера вроде бы никто сильно и не выбивается Тут есть нюанс доверительного интервала, тк я эти 7% получил на глаз, и хрен знает какова вероятность такой погрешности, так что небольшие отклонения в редких случаях допустимы В принципе методика оценки интересная, надо будет подумать в каком виде её можно внедрить на сайт, но это КТТС, в первую очередь разработка новой версии мода, как только зарелижу, постараюсь договориться с разрабами модпаков, чтоб они добавили. Есть идея дать возможность из других модов добавлять теги на события, а на сайте по тегам фильтровать, получится такая вот бесплатная и достоверная подробная аналитика. Никакая гугл аналитика не скажет с каким разбросом играют на модпаке джова
  18. В этой выборке нет, но во вложениях есть файл с исходными данными в том числе и регионом. Мне кажется сомнительным, что на разных регионах разное распределение рандома внутри одной игры. Это можно будет проверить когда будет больше боёв на других регионах Они гладкие пока в них всего 10 секций, если секуции увеличивать появляется сильный шум, и к тому же, это графики не NA и EU сервера, а одного игрока с NA и однго игрока с EU
  19. Да, сейчас у меня считается круг разброса как будто это снайперский прицел обычного танка, а надо считать так, тогда и с артой всё будет хорошо Вот подогнанный Рэлей с возможностью масштабироваться и двигаться во всех направлениях Тоже так себе. Сейчас такое распределение стало, что и экспонентой плохо аппроксимируется, но когда я начинал тот пост писать, экспонентой было норм Наверное аппроксимацию гистограммы надо вообще просто сплайном искать да и всё. Такое падение на 0.05-0.1 тяжело чем то адекватным описать
  20. HipPoint правильно брать от сюда (мне кажется сомнительным тк тоже связано с трассером, но другого я не нашел)? И ещё назрел вопрос о результатах боя, насколько я нагуглил у картошки нет способа через API их получить и если человек закрыл игру не дождавшись результата, то я его никак не узнаю. А если не закрыл, то результат брать от сюда? мне надо в том числе и во время другого боя, и по завершению текущего, в игре ещё не тыкал, сейчас совсем времени нет в танки играть.
  21. Генератор случайных чисел как в танках Задача. Написать генератор случайных чисел чтоб получить распределение как в танках, каким либо общеизвестным методом оно не описывается. Шаг 1. Берём много выстрелов, можем от сюда и строим по ним гистограмму распределения, пусть на N = 100 столбцов data = readtable("./server.csv", opts); data = data{:,[1,2,3]}; N = 100; h = hist(data(:,3), N); Шаг 2. Находим аппроксимацию полученной гистограммы, экспериментальным путём лучше всего описывается с помощью функции вида a*exp(b*x) + c*exp(d*x) fitResult = fit(linspace(0, 1, N)', h', 'exp2'); [a, b, c, d] = deal(fitResult.a, fitResult.b, fitResult.c, fitResult.d) vpa([a, b, c, d], 30) F = @(x) (a*exp(b*x) + c*exp(d*x)); Шаг 3. Нормируем получившуюся плотность. Интеграл плотности от 0 до 1 = 1, для этого делим функцию на интеграл PDF = @(x) (a*exp(b*x) + c*exp(d*x)) / integral(F, 0, 1); Шаг 4. Находим функцию распределения как интеграл от плотности. В качестве константы при интегрирование вычитаем значение интеграла в 0, чтоб распределение имело значения от 0 до 1 CDF = matlabFunction(int(sym(PDF))); CDF = matlabFunction(sym(CDF) - CDF(0)); Шаг 5. Находим функцию обратную данной, аналитически не вышло, делаем численно. xx = linspace(0, 1, 100); yy = CDF(xx); revCDF = @(x) interp1(yy, xx, x); Шаг 6. Аппроксимируем обратную функцию. Тут хоть сколько нибудь адекватной аппроксимацией получился полином 9 степени (p1*x^9 + p2*x^8 + p3*x^7 + p4*x^6 + p5*x^5 + p6*x^4 + p7*x^3 + p8*x^2 + p9*x + p10) X = linspace(0, 1, N); revCDF = fit(X', revCDF(X)', 'poly9', 'Robust', 'Lar'); [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10] = deal(revCDF.p1, revCDF.p2, revCDF.p3, revCDF.p4, revCDF.p5, revCDF.p6, revCDF.p7, revCDF.p8, revCDF.p9, revCDF.p10) revCDF = matlabFunction(p1*x^9 + p2*x^8 + p3*x^7 + p4*x^6 + p5*x^5 + p6*x^4 + p7*x^3 + p8*x^2 + p9*x + p10); Шаг 7. Готово. Теперь для получение случайных чисел достаточно вызвать revCDF(Rand()), где Rand() генерирует случайное число равномерно распределённое от 0 до 1. Чтоб убедиться строим гистограмму от 10 миллионов случайных чисел и сравниваем с исходной гистограммой histogram(data(:,3), 50,'Normalization','probability'); hold on histogram(revCDF(rand(10e6, 1)), 50,'Normalization','probability'); Результат: Коэффициенты формул: PDF: a = 170303.75999096324085 b = -3.9596481004599288767 c = -169770.0697609304043 d = -4.0490033841995565211 a*exp(b*x) + c*exp(d*x) invCDF: p1 = 60.643177737472981903 p2 = -268.4866364087093870 p3 = 511.04790264076154926 p4 = -545.3738964542347957 p5 = 358.28863739253199583 p6 = -150.0669928063029487 p7 = 40.683377765003896798 p8 = -7.116679640521884842 p9 = 1.3780439852440364845 p10 = 0.0024099699685065862 p1*x^9 + p2*x^8 + p3*x^7 + p4*x^6 + p5*x^5 + p6*x^4 + p7*x^3 + p8*x^2 + p9*x + p10 PDF = 171.67590541705826929*exp(-3.9596481004599288767*x) - 171.13791521967221624*exp(-4.0490033841995565211*x) CDF = 42.266676261003986781*exp(-4.0490033841995574093*x) - 43.356354166199118083*exp(-3.9596481004599288767*x) + 1.0896779051951310802 revCDF = 60.643177737472981903*x^9 - 268.48663640870938707*x^8 + 511.04790264076149242*x^7 - 545.37389645423479578*x^6 + 358.28863739253199583*x^5 - 150.06699280630289195*x^4 + 40.683377765003896798*x^3 - 7.116679640521884842*x^2 + 1.3780439852440360404*x + 0.0024099699685065862145 Полный код в матлаб: clear clc close all syms x opts = delimitedTextImportOptions("NumVariables", 4); opts.DataLines = [1, Inf]; opts.Delimiter = ","; opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4"]; opts.VariableTypes = ["double", "double", "double", "datetime"]; opts.ExtraColumnsRule = "ignore"; opts.EmptyLineRule = "read"; opts = setvaropts(opts, "VarName4", "InputFormat", "yyyy-MM-dd HH:mm:ss.SSS"); data = readtable("./wot-stat-filtered.csv", opts); data = data{:,[1,2,3]}; N = 100; h = hist(data(:,3), N); fitResult = fit(linspace(0, 1, N)', h', 'exp2'); %Исходная аппроксимация [a, b, c, d] = deal(fitResult.a, fitResult.b, fitResult.c, fitResult.d) vpa([a, b, c, d], 30) F = @(x) (a*exp(b*x) + c*exp(d*x)); %Нормируем PDF = @(x) (a*exp(b*x) + c*exp(d*x)) / integral(F, 0, 1); %CDF = integral(PDF) CDF = matlabFunction(int(sym(PDF))); CDF = matlabFunction(sym(CDF) - CDF(0)); %Находим численно обратную xx = linspace(0, 1, 100); yy = CDF(xx); revCDF = @(x) interp1(yy, xx, x); %Аппроксимируем обратную X = linspace(0, 1, N); revCDF = fit(X', revCDF(X)', 'poly9', 'Robust', 'Lar'); [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10] = deal(revCDF.p1, revCDF.p2, revCDF.p3, revCDF.p4, revCDF.p5, revCDF.p6, revCDF.p7, revCDF.p8, revCDF.p9, revCDF.p10) revCDF = matlabFunction(p1*x^9 + p2*x^8 + p3*x^7 + p4*x^6 + p5*x^5 + p6*x^4 + p7*x^3 + p8*x^2 + p9*x + p10); %Рисуем хистограмму для сравнения histogram(data(:,3), 50,'Normalization','probability'); hold on histogram(revCDF(rand(10e6, 1)), 50,'Normalization','probability'); rng(0) window = 100; smooth = smoothdata(data(:,3), 'movmean', window); smoothCorrect = smoothdata(revCDF(rand(length(data(:,3)), 1)), 'movmean', window); figure plot(data(:,1), smooth) hold on plot(data(:,1), smoothCorrect) PDFCDF.m
  22. Знаю. Читал его, по этому и написал согласно общему представлению, а в общем представление патент виноват во всех бедах жизни Понял. Спасибо. Мне конечно уже рассказали что спойлеры лучше не юзать, они вредны для SEO, но пригодится Ну звучит как единственное логичное объяснение, но конечно странно, что распределение выстрелов разное на серверах, но можно будет потом проверить, когда сделаю новую версию мода, напишу Европейским стримерам, может быть попиарят. В новой версии опять таки будет можно, а ещё можно искать корреляции между разбросом, уроном и пробитием. Если предположить, что все выстрелы всегда летят без учёта рандома, всегда в 0.395 от сведения, то для отклонения выборки из 100 выстрелов до 0.43 понадобится 5 выстрелов в самый край, ровно как и для отклонения до 0.36 понадобится 5 выстрелов ровно в центр. Весьма периодичные перепады графика от 0.36 до 0.43, означают разницу в 10 выстрелов полетевших вместо идеального центра в идеальный край. Понятное дело что на самом деле разница будет не в 10 выстрелах центр/край, а в 20+ выстрелах полетевших почти в центр/почти в край Возможно именно это и вызывает ощущение "подкрутки", когда есть серия в которой много выстрелов летят почти в центр, а потом серия, в которой много выстрелов летит в край. Лично для меня всё ещё странно, что бегущее среднее по рандому получись не прямой с шумом, а пилообразным графиком с шумом (я пытался найти ответ, и даже спрашивал знающих людей, но так и не понял) 10к выстрелов -> бегущее среднее по 100 -> фильтр нижних частот И синусоида, так что пики и впадины весьма периодичны
  23. Не доказательство подкрутки Есть различные метрики анализа случайных последовательностей, отличие метрики отдельно взятого игрока от серверного значения может являться следствием подкрути. Сейчас мод умеет записывать траекторию трассера, и считать точку пересечение трассера с маркером прицела на момент перед выстрелом. Точка попадания считается в том месте, где её видит человек из снайперского прицела (разброс -- круг в плоскости параллельной монитору), такой способ не совсем правильный с точки зрения механики разброса, однако близок к нему, и отображает то, что видит человек на мониторе. Хранятся точки в полярных координатах, далее оценивается относительное расстояние (0 означает что снаряд попал ровно в центр прицела, 1 -- снаряд попал ровно на границу сведения). Дальнейшие вычисления проводятся на выборке с 01.06.2021 по 18.08.2021, выстрелы артиллерии исключены (старая версия мода записывала их с багом), режим боя: стандартный 1. Гистограмма распределения: Отображает распределение снарядов внутри круга разброса, на горизонтальной оси -- секции прицела (как на стрелковых мишенях), на вертикальной -- относительное количество выстрелов, попавших в эту секцию (чем выше левые столбики, тем чаще снаряды летели в центр) Я выбрал игрока JlOnATKA, у него 3294 выстрела, построил график распределения и сравнил его со среднесерверным распределением на (58773 выстрелов) Распределения почти совпадают, в пределах погрешности, так что примитивной подкрутки тут нет. В среднем все выстрелы этого игрока летели ровно так же, как летят в среднем по серверу. Постоянная ссылка на интерактивный график 2. Скользящее среднее по подряд идущим выстрелам одного аккаунта Можно предположить, что выстрелы сначала "откручивают", а потом "подкручивают", согласно общему представлению патента кислого "чем лучше играешь, тем хуже летит, чем хуже играешь, тем летит лучше". В среднем будет всё верно, однако должны быть серии подряд идущих "неудач", для этих целей есть график скользящего среднего. Он выбирает N выстрелов, берёт расстояние от центра до точки попадания, и строит среднее по W элементам (точка, стоящая на X месте будет равна среднему от промежутка [X-W, X]. На графике индекс означает сколько выстрелов назад случился текущей выстрел, то есть самый последний выстрел был 0 выстрелов назад, находится справа) Всё по тому же игроку При окне усреднения = 30 уже винды некоторе пики и падения. Что если увеличить окно усреднения: Уже больше похоже на подкрутку, с 715 по 623 выстрел летело "плохо", в среднем в 43% разброса, зато с 577 по 508 выстрел летело "хорошо" в среднем в 36% разброса Постоянная ссылка на группу этих графиков На этом мои познания в мат статистике закончились, и я не нашел ничего лучшего, чем сгенерить выстрелы вручную и посмотреть чё там у заведомо честного генератора. И у него всё примерно так же, для окна в 100 элементов значения прыгают от 0.31 до 0.48, значит этот промежуток можно считать пределами нормы. Синим танки, красным моё. Окно = 100 3. Анализ генератора псевдослучайных чисел. Прошлый способ даёт визуально понять подкрутку по времени путём выявления пиков, выходящих за пределы допустимой зоны, однако если пики внутри допустимой зоны, и частота пиков вверх чаще "нормы", это тоже является подкруткой. Для таких случаев разработаны различные способы анализа качества генераторов случайных чисел, к сожалению, кроме того что они разработаны, я о них не знаю ничего. PS. Я вот писал всё это, и хотел в качестве примера взять аккаунт, на котором настреляно максимум выстрелов, однако топ2 игрока по количеству выстрелов в моём моде это игроки с NA и EU клиентов игры. И вот у них чёртова подкрутка есть даже на распределение. Вот график. И я не знаю, как это объяснить. Сравнить распределение серверов я не могу, тк слишком мало пока что играет не на RU PS2. Прикладываю два csv файла. Full (189к строк) полные данные о выстрелах, Filtered (98к строк) выстрелы за 7 версию мода (исправлены баги), без арты с которой есть погрешность и с убранными выстрелами когда снаряд полетел за пределы круга сведения, для анализа советую использовать именно эту. wot-stat-filtered.csvwot-stat-Full.csv
  24. Новая тема идеологически вообще о другом моде Тут обсуждались тупые вопросы мол "как сделать" анализ полёта снаряда, там общий сбор различных событий, где траектория снаряда лишь частный случай. Менять общую повестку на 3 странице я не сторонник, как по мне, лучше много маленьких тем, чем одна большая Уже накидал примерную основу нового мода, думаю на этой неделе начну делать бэк, а дальше добавление новых событий будет лишь вопросом питона в моде Название темы поменяю на кликбейт)
  25. Создал тему с планами на 2 версию мода, идеи предложения туда Ну а сюда тогда вопрос, можно ли хоть сколько нибудь достоверно получать информацию о толщине брони в точке по вектору, был раньше модик который показывал приведённю броню и шанс пробития, можно ли такое сейчас считать и можно ли например считать для своего танка, мол какая была вероятность что меня пробили бы Я видел мод для расчёта реальной точки попадания, но насколько я понял это уже после боя, а мне хотелось бы во время игры и чтоб не лагало
×
×
  • Create New...