Перейти к содержанию
Asterios

Статистические вероятности при заточке оружия.


Inev1table

Рекомендуемые сообщения

Мне было очень интересно смоделировать заточку оружия в л2 и попробовать ответить на несколько вопросов:

Сколько скроллов нужно потратить для того чтобы заточить оружие на +16

Сколько это будет стоить

Сколько нужно раз в среднем "точить" оружие для того чтобы получить желаемый результат.

Также, эту модель можно использовать для того чтобы понять адекватную наценку на искомое тобой оружие. Понятное дело что есть уникальные вещи, присутствующие на рынке в единственном экземпляре, какие-нибудь там топ Ы копья +16, где само копье только и падает что с антараса/валакаса с не стопроцентным шансом, но все равно, именно наценку НА ЗАТОЧКУ с помощью выведенной мной формулы можно вывести.
Формулу в принципе можно написать на любом языке программирования (только на жс не стоит переносить, там математика бывает непредсказуемой), но я написал ее на пхп, так наибольший круг людей сможет ее прочитать, и, если я что-то упустил подправить.
Собственно, сама формула:
 

Spoiler
<?php
// Цена обычной заточки нужного грейда, в миллионах адены
$sco_price = 10;
// Цена блесс заточки нужного грейда, в миллионах адены
$scb_price = 250;
// Нужный нам уровень зачарования
$max_e = 16;
function oneSuccess($max_e, $sco_price, $scb_price) {
  $e = 0;
  $scb = 0;
  $sco = 0;
  $attempts = 0;
  $failures = 0;
  do {
    $attempts += 1;
    if ($e <= 3) {
      $sco += 1;
      $e += 1;
    } else {
      $scb += 1;
      $prob = mt_rand(0, 99);
      if ($prob <= 66) {
        $e += 1;
      } else {
        $failures += 1;
        $e = 0;
      }
    }
  } while ($e < $max_e);
  $overall = ($sco * $sco_price) + ($scb * 250);
  return [
    'scb' => $scb,
    'sco' => $sco,
    'attempts' => $attempts,
    'overall' => $overall,
    'failures' => $failures
  ];
}
$max = 100000;
$scb = 0;
$sco = 0;
$attempts = 0;
$overall = 0;
$failures = 0;
$max_c = [
  'scb' => 0,
  'sco' => 0,
  'attempts' => 0,
  'overall' => 0,
  'failures' => 0
];

foreach (range(0, $max) as $succ){
  $new_success = oneSuccess($max_e, $sco_price, $scb_price);
  if ($new_success['scb'] > $max_c['scb']){
    $max_c['scb'] = $new_success['scb'];
  }
  $scb += $new_success['scb'];
  if ($new_success['sco'] > $max_c['sco']){
    $max_c['sco'] = $new_success['sco'];
  }
  $sco += $new_success['sco'];
  if ($new_success['attempts'] > $max_c['attempts']){
    $max_c['attempts'] = $new_success['attempts'];
  }
  $attempts += $new_success['attempts'];
  if ($new_success['overall'] > $max_c['overall']){
    $max_c['overall'] = $new_success['overall'];
  }
  $overall += $new_success['overall'];
  if ($new_success['failures'] > $max_c['failures']){
    $max_c['failures'] = $new_success['failures'];
  }
  $failures += $new_success['failures'];
}
$average_scb = $scb/$max;
$average_sco = $sco/$max;
$average_attempts = $attempts/$max;
$average_overall = $overall/$max;
$average_failures = $failures/$max;

print("average_scb: $average_scb, average_sco: $average_sco, average_attempts: $average_attempts, average_overall: $average_overall, average failures: $average_failures,");
print("\n max: \n");
print_r($max_c);

 

Для того чтобы воспользоваться формулой в своих целях можете скопировать ее из поста, перейти например на https://onlinephp.io/ и вставить в окошко написанный мной код.
Основные константы вынесены в самое начало файла. Если вам нужно посчитать не Ы грейд оружие, а, скажем, б грейд,  но которое вы тоже планируете затачивать блесками (рарные/топовые в своем грейде пушки) измените значение $scb и $sco на подходящие для вашего таргетного грейда.
Если вам интересно поиграть и понять сколько будет стоить в среднем заточка не на 16 а скажем 15 или и того меньше 

Spoiler

Отличие обратно пропорционально шансу. Так как заточка с n на n+1 66%, то каждое уменьшение на 1 будет стоить вам в среднем на 30% дешевле.
Для примера - на ста тысячах смоделированных попыток заточка на +16 стоит около 97 миллиардов адены (В СРЕДНЕМ)
Максимальное (самое невезучее из этих ста тысяч попыток) потратило 1234410 (один триллион, двести тридцать четыре миллиарда, четыреста десять миллионов)
При уменьшении таргетируемой заточки до 15:
Среднее значение потраченной адены приходит к шестидесяти четырем миллиардам, но самое невезучее все также тратит около триллиона адены

Как выглядит получаемый ответ
 

Spoiler

average_scb: 368.97163, average_sco: 491.1196, average_attempts: 860.09123, average_overall: 97154.1035, average failures: 121.77989,
 max: 
Array
(
    [scb] => 4656
    [sco] => 6320
    [attempts] => 10976
    [overall] => 1227200
    [failures] => 1579
)
 

В выкладываемой версии скрипта количество удачных экспериментов для подсчета снижено до десяти тысяч, публичные интерпретаторы не ходят долго думать над вашими задачками.
Если у вас есть свой интерпретатор на компе - можете изменить значение на 36-й строке и просто добавить нолик.
Урезанная версия которую можно использовать для вычисления значения без блессок, чисто скроллы горят ну и оружие, конечно:
 

Spoiler
<?php
// Цена обычной заточки нужного грейда, в миллионах адены
$sco_price = 10;
// Нужный нам уровень зачарования
$max_e = 16;
function oneSuccess($max_e, $sco_price) {
  $e = 0;
  $failures = 0;
  $sco = 0;
  do {
    if ($e <= 3) {
      $sco += 1;
      $e += 1;
    } else {
      $sco += 1;
      $prob = mt_rand(0, 99);
      if ($prob <= 66) {
        $e += 1;
      } else {
        $e = 0;
        $failures += 1;
      }
    }
  } while ($e < $max_e);
  $overall = ($sco * $sco_price);
  return [
    'sco' => $sco,
    'overall' => $overall,
    'failures' => $failures
  ];
}
$max = 100000;
$sco = 0;
$overall = 0;
$failures = 0;
$max_c = [
  'sco' => 0,
  'overall' => 0,
  'failures' => 0
];

foreach (range(0, $max) as $succ){
  $new_success = oneSuccess($max_e, $sco_price);
  $sco += $new_success['sco'];
  if ($new_success['sco'] > $max_c['sco']){
    $max_c['sco'] = $new_success['sco'];
  }
  $failures += $new_success['failures'];
  if ($new_success['failures'] > $max_c['failures']){
    $max_c['failures'] = $new_success['failures'];
  }
  $attempts += $new_success['attempts'];
  if ($new_success['overall'] > $max_c['overall']){
    $max_c['overall'] = $new_success['overall'];
  }
  $overall += $new_success['overall'];
}
$average_sco = $sco/$max;
$average_overall = $overall/$max;
$average_failures = $failures/$max;

print("average_sco: $average_sco, average_overall $average_overall, average failures: $average_failures");
print("\n max: \n");
print_r($max_c);

 

Могу сделать тоже самое для брони, если вы попросите.
Безусловно это не панацея. Пареньку или девушке у которой вы покупаете заточенную пушку могло очень не повезти при заточке, и он(а) могли быть самыми невезучими на свете, и потратить целый триллион на заточку до 16-ти.
Но среднее по больнице статистическое значение более или менее справедливой наценки на заточку с помощью этих формул высчитать удастся.
Для разных грейдов и стоимостей заточек.

Ссылка на комментарий
Поделиться на другие сайты

Даже лень читать. По названию темы - бред. Подобное интересовало в году так 2011.

Ссылка на комментарий
Поделиться на другие сайты

https://forum.asterios.tm/topic/499995-шанс-заточки-упал/#comment-7932996

Изменено пользователем фонАйнцберн
Ссылка на комментарий
Поделиться на другие сайты

2 hours ago, фонАйнцберн said:

Так я и считал по 66%

 

2 hours ago, Blake said:

Даже лень читать. По названию темы - бред. Подобное интересовало в году так 2011.

Тогда зачем ты это высрал? Я написал это и сделал для того чтобы поделиться с теми кому так же как и мне может быть интересно, но не могут или лень посчитать формулой.

Ссылка на комментарий
Поделиться на другие сайты

Была мысля как-то использовать формулу бернулли или биноминальный коэффициент для подсчета удачных заточек, чтоб вывести статистику, но стало лень в итоге тыкать 1000 шмоток для таких целей 

Изменено пользователем Seiso
Ссылка на комментарий
Поделиться на другие сайты

Не могу сказать точно, но челы которые копались в серверном коде слитой ПТСки говорили про странную оптимизацию древних времён. 
Суть её в том, что специфика функций генерации рандомного значения конкретно в плюсах (и принцип генерации рандомного числа в принципе) обходятся хаком пакетной записи в темп бд. Т.е. вместо того, чтобы внутри каждого шансового события вызывать функцию генерации рандомного числа с передачей в неё параметра успеха, вызывается функция чтения готового результата определённой категории (например, 66%).

 

Т.е., клиент (или бд) заранее готовит пачки результатов по n штук в категории определённой вероятности события. А все события, которые затрагивают эту вероятность не считают её сами, а читают последний свободный результат. Типа, раза три сгенерировали true/false по вероятности 66% по 100 штук.
Получили 
id in [0 .. 99] => true

id in [100 ..199] => false

id in [200 .. 299] => true

 

Дальше все события, у которых вероятность успеха 66%, читают строки через id++, и используют предзаписанный результат.
Среди таких событий может оказаться как заточка пухи, так и проверка прохождения дебафа на моба, чей шанс насчитался в 66%.

 

Такая котоламповая история, в принципе, неплохо вписывается в проблемы rand() с одной стороны, и так называемые "волны заточки", наблюдаемые эмпирически.

И ещё она объясняет почему математика не работает на шансы заточки. 



зы, это касательно ПТС реализации. Как оно в астеровской реализации на джаве знает только админ :)
Учитывая времена, процесс вполне мог быть немного оптимизирован в сторону микросервисного подхода.

Ссылка на комментарий
Поделиться на другие сайты

Зачем всё это? Тупо корейский рандом, покупаем пухи/шмом и точим точим точим!

Ссылка на комментарий
Поделиться на другие сайты

49 минут назад, GoGaFuNPlaY сказал:

Ну как бы не 66% а меньше.Прикинь😁

https://forum.asterios.tm/topic/1918-jeto-ne-bagi-jeto-fichi/#comment-2711729

 

не нужно ничего прикидывать

Ссылка на комментарий
Поделиться на другие сайты

Я легенда! Я все знаю! Чтобы заточить пуху на +16, надо 16 скроллов, а это 160кк примерно) 

Ссылка на комментарий
Поделиться на другие сайты

Эта формула чистая абстракция-как тот сферический конь в вакууме. К реальности она не имеет никакого отношения.

Если вам нужна точеная пушка-то ее нужно просто купить-а если хотите точить сами-то покупаем где-то 150 пушек и по 7 заточек на пушку.

Логика подсказывает что уже точеная пушка на рынке будет дешевле чем 150 неточеных.

А если вы вычислите по этой формуле что вам надо вот столько пушек и все их сломаете-

то вам будет служить утешением что шанс сломать все эти пушки был очень маленький.

Значит вам повезло.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
28.02.2023 в 14:43, МИ6 сказал:

Да да

верим в 66:)

адепты 66% заточки не месте?)

из 20 ССок на 4 зашло 4

4 из 20

?

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Rankars сказал:

...

4 из 20

?

Статистика познаётся на больших числах. 20 пух это статистическая ничтожность, всё равно что пару раз монетку бросить и заявлять о шансах.

Купи 200 пух, а лучше 2000, вот тогда можно говорить о процентах и шансах.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, tosser сказал:

Купи 200 пух, а лучше 2000, вот тогда можно говорить о процентах и шансах.

 

Неа. Рандомайзер-то общий на сервер. Статистически он выдаст тру в 66% вызовов. Что никак не помешает кому-то несчастному стабильно попадать в 34% фолс всеми своими 2000 пухами.

Заур недавно точил тысячу с хвостиком пух и получил 1 на 16. Что, в принципе, хреновенько при математической вероятности успеха 1 к 766.

С другой стороны, на 15 у него зашло 4 пухи, при вероятности 1/460. Т.е. на этом этапе ему "повезло" почти в два раза выше номинала)

 

13 часов назад, Ctulhu сказал:

Всё что связано с заточкой это колдунство 🧙

 

Всё просто, для успешной заточки вам потребуется простое, советское

Скрытый текст

МАССОВОЕ ЖЕРТВОПРИНОЩЕНИЕ ВО СЛВАУ БОГОВ ХАСОА!

 

Ссылка на комментарий
Поделиться на другие сайты

На ютубе есть видео про шанс заточки и как он сделан в л2, там не только про заточка но и про рулетку и про шансы критов и про шансы спойла.

 

Воьщем 50 60% это не те что высчитываются математикой типа если 50% то каждая 2я точится. Там какой-то скриптовый рандом, что идёт сериями сначала удачи потом неудачи, если попадаешь в серию "удач" То точится,часто, например 7раз из 10, если наоборот, в серию неудач, то в ней чаще неудачи и НЕ точится 7 из 10ти.

 

Потому наверное и в видео разных про рулетку челу то везёт постоянно он миллиард за миллиардом прдымает, клацая нонстоп по 2 3 раза угадывает число за 20сек, то ждёт и больше 100фейлов подряд. Та и точка тоже так же

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, etof1shka сказал:

Воьщем 50 60% это не те что высчитываются математикой типа если 50% то каждая 2я точится. Там какой-то скриптовый рандом, что идёт сериями сначала удачи потом неудачи, если попадаешь в серию "удач" То точится,часто, например 7раз из 10, если наоборот, в серию неудач, то в ней чаще неудачи и НЕ точится 7 из 10ти.

 

 

Это сильно зависит от серверных оптимизаций сервера. У каждого приличного проекта она своя.
Как я понимаю, там смотрели слитые исходники. И прогеры нисисофта решили не парится и тупо предзаписывали результат в БД с множественным повтором.
Чтобы вместо вызова функции рандомайзера вызывать простое сравнение.

Типа, рандомайзер выдал 33, 66, 89. А в предзапись попало: 33, 33, 33, 33, 66, 66, 66, 89, 89, 89 (ну или с доп хитростью в лице индивидуального модификатора, а-ля делим результат на х, результат записываем в количестве равно второму знаку после запятой). А т.к. таблица общая, то её задействуют и запросы на точку, и запросы на расчёт дебафов. Таким образом уловить последовательность невозможно. Для этого нужно быть одним на сервере.

Ссылка на комментарий
Поделиться на другие сайты

19 часов назад, etof1shka сказал:

Там какой-то скриптовый рандом, что идёт сериями сначала удачи потом неудачи

 

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

 

Ed: "DiesIrae опередил, не заметил)

Изменено пользователем Katamaranov
Ссылка на комментарий
Поделиться на другие сайты

В 31.08.2024 в 02:27, diesIrae сказал:

 

Неа. Рандомайзер-то общий на сервер. Статистически он выдаст тру в 66% вызовов. Что никак не помешает кому-то несчастному стабильно попадать в 34% фолс всеми своими 2000 пухами.

Заур недавно точил тысячу с хвостиком пух и получил 1 на 16. Что, в принципе, хреновенько при математической вероятности успеха 1 к 766.

С другой стороны, на 15 у него зашло 4 пухи, при вероятности 1/460. Т.е. на этом этапе ему "повезло" почти в два раза выше номинала)

 

 

Всё просто, для успешной заточки вам потребуется простое, советское

  Показать контент

МАССОВОЕ ЖЕРТВОПРИНОЩЕНИЕ ВО СЛВАУ БОГОВ ХАСОА!

 

В прошлом году я точил ~20 топ Ц пик, лесенкой, две из них последовательно зашли на 16. И всё же рандомайзер здесь не при чём, он генерит однажды на перезапуск сервера, да. Ходит по кругу, да. Но количество сгенерённых значений велико и выборка идёт на любое событие, которое обращается к генератору, поэтому предсказать невозможно, и именно поэтому на больших числах всё усредняется в ростом количества попыток и в итоге выходит на заданные рандомайзеру параметры, т. е. в те самые 66%.

Ссылка на комментарий
Поделиться на другие сайты

От 300 до 1000, как показал недавний стрим

Ссылка на комментарий
Поделиться на другие сайты

Когда вы это считаете важно понимать что вы считаете и получаете в итоге

обычно считают вероятность N событий подряд (т.е. +4 +5 +6..., +16 необходимо 13 успешных заточек подряд)

 

а это значит что полученный результат не сильно поможет при заточке "лесенкой", т.к. даже если у вас получится что для 13 успешных заточек подряд вам необходимо 500 пушек, это значит что у вас будет цепочка удачных заточек в количества 13 штук (т.е. вы точнее 13 пушек на +1 заточку без сломов при заточке лесенкой), но это ничего общего с получением оружия +16 не имеет (для данного типа заточки)

Изменено пользователем MadeInUkraine
Ссылка на комментарий
Поделиться на другие сайты

Грубо говоря считаем что шанс 66% это приблизительно (округляя до целых пух) 1 из 2 заточится. Тогда для +4 нужно 2 пухи, для +5 нужно 4 пухи и так далее. Путём вычисления несложной прогрессии получаем, что для гарантированной заточки на +16 необходимо 4096 пух. Естественно это число может быть и меньше, вплоть до того, что каждая итерация будет успешной, тогда нужна всего 1 пуха. Итого ответ: нужно от 1 до 4096 пух.

Ссылка на комментарий
Поделиться на другие сайты

Общий генератор чисел для всех событий подразумевает, что числа для верификации события будут вытаскиваться из пачки, от сюда и волны, что из 10 пух ни одна на 6 не зайдет, или скил с шансом 80% 3-4 раза не заходит подряд.

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...