• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
Иконка ресурса

[Плагин Union] Равномерный шанс - Плагин сломан, не качайте

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
Чтобы не рисовать пиксели, можно сделать числовую таблицу результатов двух типов генераторов, где за условный комфортный диапазон, в который должен уложиться рандомайзер, возьмем 10 обращений к генератору. То есть при шансе 50% десять запросов должны вернуть примерно 50% единиц. Тогда таблица будет выглядеть следующим образом:
Где нумерованные дельты определяют вероятности каждый цикл по 10 запросов к генератору. Тогда средняя дельта должна быть примерно равна ожидаемой вероятности.
Ожидаемая вероятностьΔ1Δ2ΔnΔсред
10%9%11%10%10%
20%18%21%20%20%
30%28%29%31%29%
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Только каждому нпс надо давать отдельный генератор, иначе они будут портить друг другу чистоту распределения.
Процитированный тобой код будет работать как надо, независимо от того, кто, когда и в каком порядке его использует. А конкретно этот плагин работает только для игрока, поэтому ему такие проблемы тоже не светят.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Очень сильно сомневаюсь в этом
А почему? Концептуально это тот же rand(), который во многих программах используется во многих местах и выдаёт ожидаемую статистику в каждом случае.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
А почему? Концептуально это тот же rand(), который во многих программах используется во многих местах и выдаёт ожидаемую статистику в каждом случае.
Если статистика линейная, то вероятность на отрезке длиной в бесконечность она действительно будет какой надо. Я не зря сказал, что хочу видеть точную распределяемость в пределах 10 ударов. В интересах плагина показывать высокую точность на коротких отрезках, а не на 100 атак или выше. Там и обычный rand будет показывать неплохие результаты.

Простой пример. Возьмем красивый паттерн какой-нибудь вероятности для одного НПС, полученный с одного генератора.
1698162859219.png


А теперь представим, что данный паттерн был случайно распределен между двумя враждующими НПС. Поделим этот паттерн на 2 с равными вероятностями соответственно.
1698163023075.png


Теперь сведем паттерны в единую линию, исключив пустоты. Получим уже не такую красивую картину, а с явно размазанными вероятностями, которые вообще не похожи на ту, которая была представлена первой.
1698163138276.png


Но опять же, это при том, что плагин будет обрабатывать нескольких НПС (я проглядел этот момент, но надеюсь что это будет в следующих обновлениях)
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
Владение, среднее значениеΔ1Δ2Δ3Δ4Δ5Δ6Δ7Δ8Δ9Δ10
============ Владение: 10 %
NEW:
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
OLD:
20%​
0%​
0%​
0%​
0%​
10%​
20%​
10%​
30%​
10%​
НовыйСред. 10%
СтарыйСред. 10%
============ Владение: 20 %
NEW:
20%​
30%​
30%​
20%​
20%​
20%​
20%​
20%​
20%​
20%​
OLD:
10%​
0%​
10%​
40%​
10%​
20%​
40%​
40%​
40%​
40%​
НовыйСред. 22%
СтарыйСред. 25%
============ Владение: 30 %
NEW:
20%​
30%​
30%​
30%​
40%​
30%​
30%​
40%​
30%​
30%​
OLD:
50%​
40%​
50%​
30%​
40%​
50%​
80%​
10%​
40%​
10%​
НовыйСред. 31%
СтарыйСред. 40%
============ Владение: 40 %
NEW:
50%​
40%​
40%​
40%​
40%​
40%​
40%​
40%​
30%​
40%​
OLD:
30%​
70%​
30%​
30%​
40%​
30%​
20%​
50%​
30%​
30%​
НовыйСред. 40%
СтарыйСред. 36%
============ Владение: 50 %
NEW:
50%​
40%​
40%​
50%​
50%​
50%​
50%​
50%​
40%​
50%​
OLD:
40%​
30%​
30%​
40%​
50%​
40%​
60%​
50%​
40%​
70%​
НовыйСред. 47%
СтарыйСред. 45%
============ Владение: 60 %
NEW:
60%​
60%​
60%​
60%​
70%​
60%​
60%​
60%​
60%​
70%​
OLD:
70%​
50%​
60%​
70%​
90%​
20%​
60%​
80%​
70%​
70%​
НовыйСред. 62%
СтарыйСред. 64%
============ Владение: 70 %
NEW:
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
OLD:
50%​
70%​
60%​
80%​
60%​
60%​
80%​
80%​
90%​
60%​
НовыйСред. 70%
СтарыйСред. 69%
============ Владение: 80 %
NEW:
80%​
80%​
70%​
90%​
70%​
80%​
80%​
80%​
90%​
80%​
OLD:
80%​
80%​
90%​
60%​
100%​
90%​
60%​
70%​
90%​
100%​
НовыйСред. 80%
СтарыйСред. 82%
============ Владение: 90 %
NEW:
90%​
90%​
80%​
90%​
90%​
90%​
90%​
90%​
90%​
90%​
OLD:
90%​
90%​
100%​
100%​
90%​
80%​
100%​
90%​
100%​
90%​
НовыйСред. 89%
СтарыйСред. 93%

Вот, сделал как смог. Брались удары по 10 штук на новом и старом генератора и потом считалась средняя вероятность и так 10 раз.
Тут все видно. Новый генератор даже на малых кол-вах держится в пределах заданного владения. Иногда бывает +10% но это не страшно.
 

Gratt


Модостроитель
Регистрация
14 Ноя 2014
Сообщения
3.300
Благодарности
4.633
Баллы
625
Владение, среднее значениеΔ1Δ2Δ3Δ4Δ5Δ6Δ7Δ8Δ9Δ10
============ Владение: 10 %
NEW:
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
10%​
OLD:
20%​
0%​
0%​
0%​
0%​
10%​
20%​
10%​
30%​
10%​
НовыйСред. 10%
СтарыйСред. 10%
============ Владение: 20 %
NEW:
20%​
30%​
30%​
20%​
20%​
20%​
20%​
20%​
20%​
20%​
OLD:
10%​
0%​
10%​
40%​
10%​
20%​
40%​
40%​
40%​
40%​
НовыйСред. 22%
СтарыйСред. 25%
============ Владение: 30 %
NEW:
20%​
30%​
30%​
30%​
40%​
30%​
30%​
40%​
30%​
30%​
OLD:
50%​
40%​
50%​
30%​
40%​
50%​
80%​
10%​
40%​
10%​
НовыйСред. 31%
СтарыйСред. 40%
============ Владение: 40 %
NEW:
50%​
40%​
40%​
40%​
40%​
40%​
40%​
40%​
30%​
40%​
OLD:
30%​
70%​
30%​
30%​
40%​
30%​
20%​
50%​
30%​
30%​
НовыйСред. 40%
СтарыйСред. 36%
============ Владение: 50 %
NEW:
50%​
40%​
40%​
50%​
50%​
50%​
50%​
50%​
40%​
50%​
OLD:
40%​
30%​
30%​
40%​
50%​
40%​
60%​
50%​
40%​
70%​
НовыйСред. 47%
СтарыйСред. 45%
============ Владение: 60 %
NEW:
60%​
60%​
60%​
60%​
70%​
60%​
60%​
60%​
60%​
70%​
OLD:
70%​
50%​
60%​
70%​
90%​
20%​
60%​
80%​
70%​
70%​
НовыйСред. 62%
СтарыйСред. 64%
============ Владение: 70 %
NEW:
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
70%​
OLD:
50%​
70%​
60%​
80%​
60%​
60%​
80%​
80%​
90%​
60%​
НовыйСред. 70%
СтарыйСред. 69%
============ Владение: 80 %
NEW:
80%​
80%​
70%​
90%​
70%​
80%​
80%​
80%​
90%​
80%​
OLD:
80%​
80%​
90%​
60%​
100%​
90%​
60%​
70%​
90%​
100%​
НовыйСред. 80%
СтарыйСред. 82%
============ Владение: 90 %
NEW:
90%​
90%​
80%​
90%​
90%​
90%​
90%​
90%​
90%​
90%​
OLD:
90%​
90%​
100%​
100%​
90%​
80%​
100%​
90%​
100%​
90%​
НовыйСред. 89%
СтарыйСред. 93%

Вот, сделал как смог. Брались удары по 10 штук на новом и старом генератора и потом считалась средняя вероятность и так 10 раз.
Тут все видно. Новый генератор даже на малых кол-вах держится в пределах заданного владения. Иногда бывает +10% но это не страшно.
Мне нравится, вполне годная распределяемость
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.077
Благодарности
1.896
Баллы
290
Если статистика линейная, то вероятность на отрезке длиной в бесконечность она действительно будет какой надо.
Я говорил о том, что 1 экземпяр генератора std::default_random_engine в одной-единственной обёртке std::uniform_real_distribution может использоваться несколькими рылами. И при этом ни одно из этих рыл не сможет достоверно определить, пользуется ли этим генератором кто-то ещё или нет.
 

avx1024

Участник форума
Регистрация
28 Дек 2017
Сообщения
13
Благодарности
43
Баллы
165
Вот куда разговор пошел. Видишь Ликер, к чему привело написание тобой этого плагина :D.
Резюмируя написанное мной, я хочу сказать что те цифры и поведение, которое получается при использовании равномерного распределения, это правильное поведение, которого и стоит ожидать, если конечно в реализации нет ошибок. Т.к. в этой, да и не только в этой ситуации, первична постановка задачи, что мы хотим получить. Если генерацию на каждом шаге с какой-то вероятностью поведения крит/не крит, то это одно, если гарантию что в серии испытаний с длиной зависящей от владения ГГ оружием вероятность крита 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;
}
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
avx1024 вот, тут считай почти весь плагин :)

- Картинка удалена, этот метод был баговым

Если крит, то возвращается значение 100 и владение подменяется на 1 удар, потом восстанавливается. Ну а остальное видно в коде.

int RX_PSEUDORANDOM_VALUE_ONEH;
int RX_PSEUDORANDOM_VALUE_TWOH;
- просто переменные, изначально 0.

Это кстати Хаарт писал для НБ, я лишь перенес в плагин и допилил под него (некоторые изменения не связанные с рандомом).
 
Последнее редактирование:

KirTheSeeker

Участник форума
Регистрация
18 Авг 2017
Сообщения
1.925
Благодарности
556
Баллы
275
Благодарю за очередной приятный патч-плагин.
Вопрос по установке - просто закинуть vdf из архива в папку Gothic 2/Data/Plugins?
 

Сумрак

Участник форума
Регистрация
25 Окт 2021
Сообщения
1.603
Благодарности
630
Баллы
175

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
LikerGothic обновил(а) ресурс [Плагин Union] Равномерный шанс критических ударов в ближнем бою / Melee random crit improve новой записью:

1.2

  1. Исправлена ошибка, теперь внутренние переменные скидываются сразу после нанесения урона (совместимость с некоторыми модами, Гильдии 1.5)

Узнать больше об этом обновлении...
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
LikerGothic обновил(а) ресурс [Плагин Union] Равномерный шанс критических ударов в ближнем бою / Melee random crit improve новой записью:

1.3

  1. Полностью переписана система внедрения рандома.
  2. Улучшена совместимость с модами
  3. Исправлены ошибки

Узнать больше об этом обновлении...
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
Полностью переписал принцип внедрения рандома. Теперь подменяется переменная g_fMinDamagePerc, это исключит потенциальные баги и улучшит совместимость с модаим.
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
LikerGothic обновил(а) ресурс [Плагин Union] Равномерный шанс критических ударов в ближнем бою / Melee random crit improve новой записью:

1.4

  1. Исправлена ошибка, теперь вероятность и распределение работают верно
  2. Добавлено сочетание клавиш SHIFT+V которое покажет статистику ударов (сбрасывается при загрузке сейва или смене локации)

Узнать больше об этом обновлении...
 

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
Не, он снова не работает. Теперь все криты сломались. Прошу удалить плагин как ресурс (я удалил описание и истоирю). Я не могу его починить.
MEG@VOLT
 
Последнее редактирование:

LikerGothic


Модостроитель
Регистрация
11 Фев 2017
Сообщения
1.635
Благодарности
2.428
Баллы
380
This resource has been removed and is no longer available. The following reason was provided:
Ликер все поломал. Шутка. Плагин не работающий. Удалено по просьбе разработчика.
 

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.832
Благодарности
6.716
Баллы
1.625
LikerGothic, Если вдруг восстановишь/починишь - пиши в личку
 
Сверху Снизу