Уважаемые гости и новички, приветствуем Вас на нашем форуме
Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».
Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Иконка ресурса
[Плагин Union] Равномерный шанс - Плагин сломан, не качайте
Чтобы не рисовать пиксели, можно сделать числовую таблицу результатов двух типов генераторов, где за условный комфортный диапазон, в который должен уложиться рандомайзер, возьмем 10 обращений к генератору. То есть при шансе 50% десять запросов должны вернуть примерно 50% единиц. Тогда таблица будет выглядеть следующим образом:
Где нумерованные дельты определяют вероятности каждый цикл по 10 запросов к генератору. Тогда средняя дельта должна быть примерно равна ожидаемой вероятности.
Процитированный тобой код будет работать как надо, независимо от того, кто, когда и в каком порядке его использует. А конкретно этот плагин работает только для игрока, поэтому ему такие проблемы тоже не светят.
Если статистика линейная, то вероятность на отрезке длиной в бесконечность она действительно будет какой надо. Я не зря сказал, что хочу видеть точную распределяемость в пределах 10 ударов. В интересах плагина показывать высокую точность на коротких отрезках, а не на 100 атак или выше. Там и обычный rand будет показывать неплохие результаты.
Простой пример. Возьмем красивый паттерн какой-нибудь вероятности для одного НПС, полученный с одного генератора.
А теперь представим, что данный паттерн был случайно распределен между двумя враждующими НПС. Поделим этот паттерн на 2 с равными вероятностями соответственно.
Теперь сведем паттерны в единую линию, исключив пустоты. Получим уже не такую красивую картину, а с явно размазанными вероятностями, которые вообще не похожи на ту, которая была представлена первой.
Но опять же, это при том, что плагин будет обрабатывать нескольких НПС (я проглядел этот момент, но надеюсь что это будет в следующих обновлениях)
Вот, сделал как смог. Брались удары по 10 штук на новом и старом генератора и потом считалась средняя вероятность и так 10 раз.
Тут все видно. Новый генератор даже на малых кол-вах держится в пределах заданного владения. Иногда бывает +10% но это не страшно.
Вот, сделал как смог. Брались удары по 10 штук на новом и старом генератора и потом считалась средняя вероятность и так 10 раз.
Тут все видно. Новый генератор даже на малых кол-вах держится в пределах заданного владения. Иногда бывает +10% но это не страшно.
Я говорил о том, что 1 экземпяр генератора std::default_random_engine в одной-единственной обёртке std::uniform_real_distribution может использоваться несколькими рылами. И при этом ни одно из этих рыл не сможет достоверно определить, пользуется ли этим генератором кто-то ещё или нет.
Вот куда разговор пошел. Видишь Ликер, к чему привело написание тобой этого плагина .
Резюмируя написанное мной, я хочу сказать что те цифры и поведение, которое получается при использовании равномерного распределения, это правильное поведение, которого и стоит ожидать, если конечно в реализации нет ошибок. Т.к. в этой, да и не только в этой ситуации, первична постановка задачи, что мы хотим получить. Если генерацию на каждом шаге с какой-то вероятностью поведения крит/не крит, то это одно, если гарантию что в серии испытаний с длиной зависящей от владения ГГ оружием вероятность крита 100%, это другое.
В 1 случае мы действительно можем получить достаточно длинные последовательности без критов, во 2 - нет. Лично мне больше нравится 1 вариант, т.к. бои получаются более интересными.
P.S. Ликер, твой текущий вариант, это концептуально что-то типо этого ?
C++:
// const Player* p;
// set zero every time before changing state to mili combat
p->miliHitCounter = 0; // int
p->curHitSeriesLen = 0; // int
p->wasCriticalinCurSeries = false; // bool
p->hitSeriesCounterPartial = 0.f; // float
bool hasCritical(const float distance/*[0.0 - 100.0]*/)
{
static std::default_random_engine generator(
std::chrono::system_clock::now().time_since_epoch().count()
);
static std::uniform_real_distribution<float> distribution(0.0, 100.0);
return distribution(generator) <= distance;
}
bool hasCritical_LikerHateProbability (const float ability, const Player* p)
{
if (ability > 100.f)
return true;
if (!p->curHitSeriesLen || p->miliHitCounter >= p->curHitSeriesLen)
{
const float ratio = 100.f / ability;
p->curHitSeriesLen = std::floor(ratio);
p->hitSeriesCounterPartial += ratio - p->curHitSeriesLen;
if (p->hitSeriesCounterPartial > 1.f)
{
p->hitSeriesCounterPartial -= 1.f;
p->curHitSeriesLen += 1;
}
p->miliHitCounter = 0;
p->wasCriticalinCurSeries = false;
}
p->miliHitCounter += 1;
if (p->wasCriticalinCurSeries)
return false;
if (hasCritical(100.f / p->curHitSeriesLen))
{
p->wasCriticalinCurSeries = true;
return true;
}
if (p->miliHitCounter >= p->curHitSeriesLen)
{
return true;
}
return false;
}
Полностью переписал принцип внедрения рандома. Теперь подменяется переменная g_fMinDamagePerc, это исключит потенциальные баги и улучшит совместимость с модаим.
На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.