Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Fazi on May 30, 2020, 02:05:16 PM
-
Всем хай ;)
Подскажите плиз кто знает, как сделать чтобы кликер делал рандомный клик по одной из трёх заданных координат.
LCLICK(164,546) // 16119285
LCLICK(455,551) // 16777215
LCLICK(853,560) // 16777215
halt
-
SWITCH(RND(1,3))
CASE(1)
LCLICK(164,546)
CASE(2)
LCLICK(455,551)
CASE(3)
LCLICK(853,560)
END_SWITCH
-
Благодарствую:)
-
SWITCH(RND(1,3))
CASE(1)
LCLICK(164,546)
CASE(2)
LCLICK(455,551)
CASE(3)
LCLICK(853,560)
END_SWITCH
Не стоит так писать. Дело в том что при каждой проверки значения CASE будет срабатывать RND
Так правильно.
$r = RND(1,3)
SWITCH($r)
CASE(1)
LCLICK(164,546)
CASE(2)
LCLICK(455,551)
CASE(3)
LCLICK(853,560)
END_SWITCH
-
Не стоит так писать. Дело в том что при каждой проверки значения CASE будет срабатывать RND
Так правильно.
$r = RND(1,3)
SWITCH($r)
CASE(1)
LCLICK(164,546)
CASE(2)
LCLICK(455,551)
CASE(3)
LCLICK(853,560)
END_SWITCH
С чего это? Откуда такая информация? Нормальныя реализация при встрече SWITCH вычисляет выражение, а при всрече CASE идёт сравнение. Зачем каждый раз вычислять?
-
Хе, хе. Заинтересовался вопросом. Набросал тест на коленке.
Свитч на 1000 значений. Замер времени выполнения на 20 проходах с вычислением среднего.
"Лизуртат":
// RND в условии SWITCH
14:53:49 время выполнения : 3 мс
14:53:49 время выполнения : 180 мс
14:53:49 время выполнения : 5 мс
14:53:49 время выполнения : 189 мс
14:53:49 время выполнения : 112 мс
14:53:49 время выполнения : 19 мс
14:53:49 время выполнения : 178 мс
14:53:50 время выполнения : 153 мс
14:53:50 время выполнения : 158 мс
14:53:50 время выполнения : 10 мс
14:53:50 время выполнения : 38 мс
14:53:50 время выполнения : 42 мс
14:53:50 время выполнения : 32 мс
14:53:50 время выполнения : 23 мс
14:53:50 время выполнения : 10 мс
14:53:50 время выполнения : 45 мс
14:53:50 время выполнения : 22 мс
14:53:50 время выполнения : 181 мс
14:53:50 время выполнения : 181 мс
14:53:50 время выполнения : 76 мс
14:53:50 Среднее время за 20 проходов: 82.85 мс
//RND отдельно
14:53:06 время выполнения : 6 мс
14:53:06 время выполнения : 116 мс
14:53:06 время выполнения : 165 мс
14:53:06 время выполнения : 13 мс
14:53:06 время выполнения : 12 мс
14:53:06 время выполнения : 76 мс
14:53:06 время выполнения : 109 мс
14:53:07 время выполнения : 124 мс
14:53:07 время выполнения : 106 мс
14:53:07 время выполнения : 141 мс
14:53:07 время выполнения : 72 мс
14:53:07 время выполнения : 24 мс
14:53:07 время выполнения : 105 мс
14:53:07 время выполнения : 53 мс
14:53:07 время выполнения : 99 мс
14:53:07 время выполнения : 115 мс
14:53:07 время выполнения : 128 мс
14:53:07 время выполнения : 59 мс
14:53:07 время выполнения : 30 мс
14:53:08 время выполнения : 105 мс
14:53:08 Среднее время за 20 проходов: 82.9 мс
Вот прям не выбирал результаты. В других запусках разброс среднего был до 125 мс, но и там и там!
-
С чего это? Откуда такая информация? Нормальныя реализация при встрече SWITCH вычисляет выражение, а при всрече CASE идёт сравнение. Зачем каждый раз вычислять?
Вот простой пример
SWITCH(RND(1,3))
CASE(1)
LOGWRITE ("1")
CASE(2)
LOGWRITE ("2")
CASE(3)
LOGWRITE ("3")
END_SWITCH
HALT
При некоторых запусках запись в лог не производится. Значит ни одно значение свитча не было верным.
-
Это значит ошибка прямых вычислений в свиче, в частности RND. Но это ни как не говорит о том, что значение вычисляется каждый раз на каждом CASE. Об этом говорит и показанный выше тест.
Здесь проблема в другом.
Вот такие прямые вычисления в свиче проходят нормально
FOR($i=0, $i < 30)
SWITCH($i - INT($i/2)*2)
CASE(0)
LOGWRITE("0")
CASE(1)
LOGWRITE("1")
DEFAULT
LOGWRITE("Err")
END_SWITCH
END_CYC
HALT
Результат:
11:20:48 0
11:20:48 1
11:20:48 0
11:20:48 1
...
Предварительный вывод (возможно ошибочный). Большинство функций RND - выдающих целочисленные значения или из списка, базируются на базовой функции выдающей значения в диапазоне 0 <= N <= 1 в виде числа с плавающей точкой. А потом уже это число переводится в нужный диапазон от и до с переводом в целое.
При приравнивании результата RND(1,3) переменной, перевод в целое осуществляется правильно.
В свитче, возможно проблемы с округлением и получается что-то вида 2.00000000001 что не равно целым 2 в Case когда значения 0 <= N <= 1 близки к переходным.
Может всё, что я написал - полная шляпа :-\