Author Topic: Рандомный клик по заданным координатам.  (Read 4201 times)

0 Members and 1 Guest are viewing this topic.

Fazi

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Всем хай ;)
Подскажите плиз кто знает, как сделать чтобы кликер делал рандомный клик по одной из трёх заданных координат.
Code: (clickermann) [Select]
LCLICK(164,546)  // 16119285
LCLICK(455,551)  // 16777215
LCLICK(853,560)  // 16777215
halt

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Code: (clickermann) [Select]
SWITCH(RND(1,3))
    CASE(1)
        LCLICK(164,546)
    CASE(2)
        LCLICK(455,551)
    CASE(3)
        LCLICK(853,560)
END_SWITCH


Fazi

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Благодарствую:)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
SWITCH(RND(1,3))
    CASE(1)
        LCLICK(164,546)
    CASE(2)
        LCLICK(455,551)
    CASE(3)
        LCLICK(853,560)
END_SWITCH

Не стоит так писать. Дело в том что при каждой проверки значения CASE будет срабатывать RND

Так правильно.
Code: (clickermann) [Select]
$r = RND(1,3)
SWITCH($r)
   CASE(1)
      LCLICK(164,546)
   CASE(2)
      LCLICK(455,551)
   CASE(3)
      LCLICK(853,560)
END_SWITCH

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Не стоит так писать. Дело в том что при каждой проверки значения CASE будет срабатывать RND

Так правильно.
Code: (clickermann) [Select]
$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 идёт сравнение. Зачем каждый раз вычислять?


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Хе, хе. Заинтересовался вопросом. Набросал тест на коленке.

Свитч на 1000 значений. Замер времени выполнения на 20 проходах с вычислением среднего.

"Лизуртат":
Quote
// 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 мс

Quote
//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 мс, но и там и там!


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
С чего это? Откуда такая информация? Нормальныя реализация при встрече SWITCH вычисляет выражение, а при всрече CASE идёт сравнение. Зачем каждый раз вычислять?

Вот простой пример
Code: (clickermann) [Select]
SWITCH(RND(1,3))
   CASE(1)
      LOGWRITE ("1")
   CASE(2)
      LOGWRITE ("2")
   CASE(3)
      LOGWRITE ("3")
END_SWITCH
HALT

При некоторых запусках запись в лог не производится. Значит ни одно значение свитча не было верным.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Это значит ошибка прямых вычислений в свиче, в частности RND. Но это ни как не говорит о том, что значение вычисляется каждый раз на каждом CASE. Об этом говорит и показанный выше тест.
Здесь проблема в другом.

Вот такие прямые вычисления в свиче проходят нормально
Code: (clickermann) [Select]
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

Результат:
Quote
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 близки к переходным.
Может всё, что я написал - полная шляпа  :-\
« Last Edit: June 02, 2020, 12:31:00 PM by Vint »