Как сделать рандомное число это понятно
Но, при создании нестандартной способности например Сильный удар, возникает проблема возникает проблема
Допустим поставим на карту 2 юнитов с такой способностью и заставим их друг друга бить
Допустим шанс срабатывания способности 20%. Два юнита бьют друг друга и тут замечается, что у одного, например способность либо почти не срабатывает, либо срабатывает очень редко, что в принципе полный бред. Потому что 20%, это как никак, но раз за 5 ударов должно пройти. НО
Совсем куда смешнее ситуация была, когда были две разные абилки, у двух разных героев, и тот у кого была абилка с шансом 15%, срабатывала бывало чаще, чем например у того, у которого была абилка с шансом 30%. Напоминаю, всё та же ситуация, когда два героя одновременно бьют друг друга.
Суть в принципе ясна. Варик генерирует числа, типа например 20,50,60,43,54,78,35,1,32,88 и т.д., а так как для всех войск на карте используется один рандом, то так получается, что когда два героя бьют друг друга, у того, у кого шанс 15% по счастливай случайности срабатывает, а у того у кого 30, нет и поэтому, у того, у кого 30% шанс, способность может не пройти даже после 5 и больше ударов, хотя по логике она должна срабатывать куда чаще.
Получается, что для каждого юнита на карте со способностью, имеющей вероятность срабатывания нужно сделать свою БД рандомов, так сказать сгенерировать ряд рандомных чисел? Или даже не для отдельного юнита, а для отдельной способности каждого юнита?
Или как это реализовать? Подскажите, кто разбирается, как например в том же Варике устроен этот рандом для скилов или в той же Дота2

И вот ещё в теме по этому поводу рассуждал
Получается, что для каждого юнита на карте со способностью, имеющей вероятность срабатывания нужно сделать свою БД рандомов, так сказать сгенерировать ряд рандомных чисел? Или даже не для отдельного юнита, а для отдельной способности каждого юнита?
avuremybe:
Proshel_Doty, ну так втули 20 циклов с рандомом. Будет тебе для 20 абилок.
Ну вот получается к этому и приходим, что нужно делать для каждого
ClotPh:
Proshel_Doty, да вот хотя бы крутилка акса в доте 2 уже именно так работает, и заряды, и перезарядка, и фактически увеличивающийся шанс
другое дело, что не обязательно в базовой информации игрокам слишком много мозги компостировать, им достаточно условно знать про шанс там 15%, 20% или 30%, ну и мб перезарядку
По-моему про крутилку акса ты чего-то не знаешь)
А именно, то что он может прокрутиться 3 раза, когда его бьют 3 юнита всего
И не крутиться почти, когда его бьют 5 крипов
Если бы оно работало, как ты говоришь, то он бы крутился всегда идеально, но там по-моему как раз вот этот безумный рандом
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
avuremybe:
Proshel_Doty, если ты хочешь не псевдо-рандом, а "рандом нормальный", то при каждом ударе обсчитывай шанс триггерно:
if (GetRandomReal(1,100)>=20) then
    ...
endif
Так вот я так и делаю и получается вот это
Совсем куда смешнее ситуация была, когда были две разные абилки, у двух разных героев, и тот у кого была абилка с шансом 15%, срабатывала бывало чаще, чем например у того, у которого была абилка с шансом 30%. Напоминаю, всё та же ситуация, когда два героя одновременно бьют друг друга.
Или может я просто не всё знаю, как работает рандом в варике?
Я не сказал, что эти две разные абилки обсчитываются в одном триггере или функции
Т.е. сначала идёт проверка первой абилки, там просчитывается шанс
Потом за ней вторая там тоже шанс
И так все существующие пассивные абилки
Т.е. в итоге получается, что шанс просчитывается одновременно не для одной абилки а для всех, которые сработали в заданный момент.
Например, у одного перса есть Способность на уклонение, и есть способность Баш, а у второго есть способность Критический удар
И для каждой получаем рандомный шанс
26
Proshel_Doty, выведи себе на экран n и убедись уже, что рандом работает как положено.
local real r
local integer i
local integer n
loop
    exitwhen i > 10000
    if (GetRandomReal(1,100)<20) then
        set n=n+1
    endif
    set i = i+1
endloop
21
avuremybe:
Proshel_Doty, выведи себе на экран n и убедись уже, что рандом работает как положено.
local real r
local integer i
local integer n
loop
    exitwhen i > 10000
    if (GetRandomReal(1,100)<20) then
        set n=n+1
    endif
    set i = i+1
endloop
Для одной абилки да)
Но я ж объясняю, что когда их срабатывает сразу несколько получается лажа
26
Proshel_Doty, ну так втули 20 циклов с рандомом. Будет тебе для 20 абилок.
21
Принятый ответ
И вот ещё в теме по этому поводу рассуждал
Получается, что для каждого юнита на карте со способностью, имеющей вероятность срабатывания нужно сделать свою БД рандомов, так сказать сгенерировать ряд рандомных чисел? Или даже не для отдельного юнита, а для отдельной способности каждого юнита?
avuremybe:
Proshel_Doty, ну так втули 20 циклов с рандомом. Будет тебе для 20 абилок.
Ну вот получается к этому и приходим, что нужно делать для каждого
ClotPh:
Proshel_Doty, да вот хотя бы крутилка акса в доте 2 уже именно так работает, и заряды, и перезарядка, и фактически увеличивающийся шанс
другое дело, что не обязательно в базовой информации игрокам слишком много мозги компостировать, им достаточно условно знать про шанс там 15%, 20% или 30%, ну и мб перезарядку
По-моему про крутилку акса ты чего-то не знаешь)
А именно, то что он может прокрутиться 3 раза, когда его бьют 3 юнита всего
И не крутиться почти, когда его бьют 5 крипов
Если бы оно работало, как ты говоришь, то он бы крутился всегда идеально, но там по-моему как раз вот этот безумный рандом
26
Proshel_Doty, ты протестируй сначала. Потому что на данный момент, ты не понимаешь о чем говоришь.
Вот когда увидишь наглядно, что все работает как положено - тогда возвращайся с вопросами.
21
avuremybe:
Proshel_Doty, ты протестируй сначала. Потому что на данный момент, ты не понимаешь о чем говоришь.
Вот когда увидишь наглядно, что все работает как положено - тогда возвращайся с вопросами.
Протестировать что?))
Я как бы про результы тестов и говорю
Или о каких тестах ты говоришь?
26
Proshel_Doty, то, что я тебе скинул. Я не знаю о каких тестах ты говоришь.
21
avuremybe:
Proshel_Doty, то, что я тебе скинул. Я не знаю о каких тестах ты говоришь.
Да это понятно, я и сам хотел это попробовать с базой данных рандомов для юнитов или для чисел
Я тему то создал для того, чтобы найти нормальное решение и понять как работате рандом в Варике и Дота 2
26
local real r
local integer i
local integer n
local integer a
local integer b
local integer c
local integer d
loop
    exitwhen i > 10000
    if (GetRandomReal(1,100)<20) then
        set n=n+1
    endif
    if (GetRandomReal(1,100)<20) then
        set a=a+1
    endif
    if (GetRandomReal(1,100)<20) then
        set b=b+1
    endif
    if (GetRandomReal(1,100)<20) then
        set c=c+1
    endif
    if (GetRandomReal(1,100)<20) then
        set d=d+1
    endif
    set i = i+1
endloop
Вот тебе для 5 абилок. Выводи себе на экран n, a, b, c, d приходи сюда со скринами, будем смотреть где тебя рандом дурит.
21
Лучше просто делать пассивки с перезарядками и/или каждый X удар/каждое X действие, это справедливее, точнее и лишних вопросов не создаст
И всё-таки, ты приведи конкретный пример с конкретными числами
ВОт я хочу сделать абилку на 20% шанс. Какое колво каких кулдаунов и кол-во ударов нужно брать и как это реализовывать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.