1 (изменено: panamaboot, 2015-05-29 13:48:41)

Тема: AHK: Рандомизация значений параметров команд

Появилась необходимость рандомизировать некоторые значения в параметрах команд , но к сожалению команда random работает не везде(( Возможно есть другой путь?
Например рандомизация числа повторений (Loop)

 Random, rand1, 1 , 10
 Loop , rand1 ; или 1 + rand1 
 { 
 ......................
 }
 return 

Скрипт не работает
Или рандомизация количества кликов правой кнопкой мыши + координат клика + скорость выполнения команды

 Random, rand1, 50, 200 
 Random, rand2 , 1, 10 
 Random, rand3 , 5, 40  
 MouseClick, r , 500 + rand1 , 400  + rand1 , 1 + rand2 ,20 + rand3
  Sleep 5000
 MouseClick, r , 500 + rand1 , 400  + rand1 , 1 + rand2 ,20 + rand3 

Не один параметр не получил случайного значения .

Господа , есть идеи ??

Не знаю, не умею, но быстро учусь!

2

Re: AHK: Рандомизация значений параметров команд

Во-первых, вам нужно оформить пост и заголовок темы как положено (см. прикреплённую тему). Иначе модератор не разрешает отвечать.

3 (изменено: Dimaryo, 2015-05-31 15:56:28)

Re: AHK: Рандомизация значений параметров команд

Так попробуй.

Random, rand1 , 50, 200  
 x:= rand1 + 500
 MouseClick, r , x , y , z , s 

4 (изменено: panamaboot, 2015-06-01 11:21:53)

Re: AHK: Рандомизация значений параметров команд

Спасибо , скрипт частично работает. При старте координаты клика X и Y получают случайные значения , а вот число кликов  и скорость нет ( я не заметил).  Возможно ли вписать  случайное значение в кол-во повторов скрипта Loop . Как сделать случайное кол-во кликов и время между ними?


^s::


Loop 
{
Random, rand1 , 300 , 500
random , rand2 , 3, 5 
random , rand3 , 10 , 70
 x:= 30 + rand1
 y:= 30 + rand1 
 s:= rand2
 z:= rand3

MouseClick,r , 200 + x , 100 + y , 1 + s  ,10 + z  
sleep , 3000
}
{
Random, rand1 , 300 , 500 
random , rand2 , 3, 5 
random , rand3 , 10 , 70 
 x:= 30 + rand1
 y:= 30 + rand1 
 s:= rand2
 z:= rand3
 
MouseClick,r , 200  + x, 100 + y , 2 + s  , 10 + z  
sleep , 3000
}

return


^q::  ExitApp

Не знаю, не умею, но быстро учусь!

5

Re: AHK: Рандомизация значений параметров команд

 Random, rand1, 1 , 10
 Loop, % rand1
   msgbox %A_Index% раз из %rand1%
 return 

Тут все правильно:

 Random, rand1, 50, 200 
 Random, rand2 , 1, 10 
 Random, rand3 , 5, 40  
 MouseClick, r , 500 + rand1 , 400  + rand1 , 1 + rand2 ,20 + rand3
  Sleep 5000
 MouseClick, r , 500 + rand1 , 400  + rand1 , 1 + rand2 ,20 + rand3 

6

Re: AHK: Рандомизация значений параметров команд

Malcev , Т.е. в скрипте , в моём предыдущем посте , кликает случайное кол-во раз и скорость выполнения команды тоже меняется ?

Не знаю, не умею, но быстро учусь!

7

Re: AHK: Рандомизация значений параметров команд

Да.

8

Re: AHK: Рандомизация значений параметров команд

Вставил ваш код в свой скрипт , он не работает . При запуске выдаёт окно например 1 из 8, жму ОК  2 из 8 ОК 3 из 8 и т.д. после 8 из 8 . скрипт отрабатывает один круг , даже если минимальное число повторов от 2 .




^s::
Random, rand1, 2 , 10
 Loop, % rand1
   msgbox %A_Index% раз из %rand1%
 
{
Random, rand1 , 300 , 500
random , rand2 , 3, 5 
random , rand3 , 10 , 70
 x:= 30 + rand1
 y:= 30 + rand1 
 s:= rand2
 z:= rand3
; MouseClick, r , x , y , z , s 

MouseClick,r , 200 , 100 + y , 1 + s  ,10 + z 
sleep , 3000
}
 {
Random, rand1 , 300 , 500 
random , rand2 , 3, 5 
random , rand3 , 10 , 70 
 x:= 30 + rand1
 y:= 30 + rand1 
 s:= rand2
 z:= rand3
; MouseClick, r , x , y , z , s 

MouseClick,r , 200 , 100 + y , 2 + s  , 10 + z  
sleep , 3000
}
return

^q::  ExitApp
Не знаю, не умею, но быстро учусь!

9

Re: AHK: Рандомизация значений параметров команд

У вас неразбериха со скобками.
В цикле только msgbox.

10

Re: AHK: Рандомизация значений параметров команд

Удалил  msgbox  всё работает , спасибо.

Не знаю, не умею, но быстро учусь!

11 (изменено: panamaboot, 2015-06-04 14:31:06)

Re: AHK: Рандомизация значений параметров команд

А можно ли рандомизировать клик мыши , но не в пределах допустим от 300  до  500  , а выбор между конкретными координатами 330 и 450 ? А если усложнить , чтобы процентное соотношение рандома было 40%  и  60%.

Не знаю, не умею, но быстро учусь!

12

Re: AHK: Рандомизация значений параметров команд

panamaboot пишет:

А можно ли рандомизировать клик мыши , но не в пределах допустим от 300  до  500  , а выбор между конкретными координатами 330 и 450 ? А если усложнить , чтобы процентное соотношение рандома было 40%  и  60%.

Random, rand1 , 330 , 450

Можно сделать два этапа. В первом random для 60 и 40, а по результатам второй уровень тех значений, что этой частоте в  40 и 60% должны соответствовать.

13

Re: AHK: Рандомизация значений параметров команд

Random rnd, 0., 1.
MsgBox % 330 + (450-330)*(rnd<0.4)

14

Re: AHK: Рандомизация значений параметров команд

Если "между конкретными координатами 330 и 450" подразумевает "или или", то последний вариант лучше, а если "что-то из конкретного диапазона", то - нет.

15

Re: AHK: Рандомизация значений параметров команд

Foma, вопрос невнимательно прочитали:

panamaboot пишет:

не в пределах допустим от 300  до  500  , а выбор между конкретными координатами 330 и 450

Другое дело, что как-то заумно слишком. Я бы то же самое так записал:

Random, rand, 0., 1.
MsgBox, % rand < 0.4 ? 330 : 450
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: panamaboot, 2015-06-05 00:36:48)

Re: AHK: Рандомизация значений параметров команд

А как можно применить этот код для клика по двум точкам , с разными координатами, с теми же условиями.


MouseClick,r , 200 , 100  , 1   ,100

или


MouseClick,r , 300 , 400  , 1   ,100
Не знаю, не умею, но быстро учусь!

17

Re: AHK: Рандомизация значений параметров команд

points := [ [200, 100], [300, 400] ]
Random, rand,, 1.
point := points[rand < 0.4 ? 1 : 2]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

или

points := [ [200, 100], [300, 400] ]
Random, rand,, 1.
i := (rand > 0.4) + 1
; CoordMode, Mouse, Screen  ; если координаты относительно экрана
MouseClick, R, points[i, 1], points[i, 2], 1, 100
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Рандомизация значений параметров команд

Пробую ещё усложнить условия  . Пишу по аналогии с кодом teadrinker ,но не получается . Условия таковы :  рандомный клик между большим количеством точек чем две , например три или четыре , с различным процентным соотношением 5-15-30-50% для четырёх точек, 20-30-50% для трёх.

Не знаю, не умею, но быстро учусь!

19

Re: AHK: Рандомизация значений параметров команд

Для трёх точек с веростностями 20-30-50%:

points := [ [200, 100], [300, 400], [500, 600] ]
Random, rand,, 1.
point := points[rand < 0.2 ? 1 : (rand >= 0.2 && rand < 0.5) ? 2 : 3]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

То же самое подробно:

points := [ [200, 100], [300, 400], [500, 600] ]
Random, rand, 0.0, 1.0

if (rand < 0.2)
   i := 1
else if (rand >= 0.2 && rand < 0.5)
   i := 2
else
   i := 3

point := points[i]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

Для четырёх по аналогии.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20

Re: AHK: Рандомизация значений параметров команд

Можно менее научно, но более наглядно в плане редактирования вероятностей, и общего количества в целом.
Для "+-1%" не очень, а вот с шагом, кратным 5% вполне сгодится.
Пример для 4-х точек с "удельным весом" 5-15-30-50%.

points := [ [200, 100], [300, 400], [500, 600],  [350, 100]]
freq := "12223333334444444444"
Random, rand, 1, StrLen(freq)
point := points[SubStr(freq, rand, 1)]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

21 (изменено: serzh82saratov, 2015-06-17 12:10:16)

Re: AHK: Рандомизация значений параметров команд

Я бы так сделал:


  ; Ключ это - координаты, значение - кол-во вероятностей относительно всех вариантов.
points := {[1, 20]: 20, [2, 20]: 20, [1, 30]: 30, [2, 30]: 30} 

For k, v in points, variants := 0, point := []
    Loop % v
        point[++variants] := k

2::
    Random rnd, 1, variants   
    MsgBox, , % rnd, % point[rnd, 1] " - " point[rnd, 2]
    Return

Можно не вдаватся в общее количество вариантов (процентов) (шаг тут любое целое число), наглядно и просто в редактировании массива.
Вариант из №19 со сравнением чисел, ещё может не подойти при надобности расклада 20-20-30-30 процентов.

Хотя если числа, проценты, одинаковые вероятности.


  ; Ключ это - координаты, значение - процент.  
points := {[1, 20]: 20, [2, 20]: 20, [1, 30]: 30, [2, 30]: 30} 

2::
    Random rnd, 1, 100 
    For point, v in points, s := 0
        s += v 
    Until s >= rnd
    MsgBox, , % rnd, % point[1] " - " point[2]
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22 (изменено: Irbis, 2015-06-16 08:17:20)

Re: AHK: Рандомизация значений параметров команд

Серж, #19 не создает никаких проблем при одинаковых вероятностях, разве что не так очевидно составление диапазонов.
Для 20-20-30-30:
0<х<0.2, 0.2<х<0.4, 0.4<х<0.7, х>0.7
Хотя вариант не самый лучший,  согласен.  Teadrinker теряет форму?

+ открыть спойлер

Шутка

23

Re: AHK: Рандомизация значений параметров команд

Да, не сообразил, но за-то при изменениях вероятностей будет всегда не скучно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Рандомизация значений параметров команд

Чуть позже напишу вариант, чтобы было скучно.

25

Re: AHK: Рандомизация значений параметров команд

serzh82saratov, я тоже прочитал про этот алгоритм — 1, 2, 3.

obj := {A: 20, B: 30, C: 50}
Random, peek, 1, 100
for k, v in obj, sum := 0
   sum += v
until sum >= peek
MsgBox, % k

В общем случае:

obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

Random, peek, 1, _sum
for k, v in obj, sum := 0
   sum += v
until sum >= peek

MsgBox, % k

Проверка:

obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

test := {A: 0, B: 0, C: 0}
Loop 10000  {
   Random, peek, 1, _sum
   for k, v in obj, sum := 0
      sum += v
   until sum >= peek && test[k]++
}

MsgBox, % test.A "`n" test.B "`n" test.C

Что же касается моего варианта, то он тоже вполне имеет право на существование, он хоть и менее нагляден, зато проще для понимания.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26 (изменено: serzh82saratov, 2015-06-17 07:32:35)

Re: AHK: Рандомизация значений параметров команд

я тоже прочитал

Честно говоря, я не читал.

Немного подправил #21, если процент будет значением в массиве, ещё нагляднее.

Считаю что в #21, 1 вариант без этого алгоритма, для работы с заранее известными вероятностями, удобнее и производительнее.

зато проще для понимания.

1 вариант тоже очень прост, создаётся "список" с одинаковыми "строками", количество которых равно количеству вариантов. Далее просто выбирается строка по случайному индексу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Рандомизация значений параметров команд

Если не читал — молодец.

Тут пары в массиве надо располагать по мере возрастания процентов.

Этого не нужно.

удобнее и производительнее

Почему производительнее — не понимаю, там ведь лишнее действие.

1 вариант тоже очень прост, создаётся "список" с одинаковыми "строками", количество которых равно количеству вариантов.

Звучит не очень просто. В моём варианте ничего дополнительно создавать не нужно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: serzh82saratov, 2015-06-17 12:36:10)

Re: AHK: Рандомизация значений параметров команд

Этого не нужно.

А, ну да, ещё лучше.

Почему производительнее — не понимаю, там ведь лишнее действие.

Для получения результата требуется только извлечение из массива, никаких сравнений и переборов.
А какое лишнее действие?

Звучит не очень просто. В моём варианте ничего дополнительно создавать не нужно.

Создание строки условий для например 50 координат, и в будущем правка пары значений, то есть поиск где в массиве 22 и 39 ключ, и где их соответствие в строке условий, будет непростым. Ну а новичкам ведь всё равно как работает, и если он тот самый 1 из 1000, думаю объяснить это будет проще, чем Walker's Alias Method.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29 (изменено: Irbis, 2015-06-17 13:46:19)

Re: AHK: Рандомизация значений параметров команд

teadrinker пишет:

Если не читал — молодец.

Тоже не читал, но хотел предложить подобный вариант. )) Правда, в нем было запланировано лишнее действие по нормализации суммы вероятностей - приведении к 100%, чтобы выбирать координату на основе случайного числа в интервале 1...100. Ваш вариант с числом от 1 до sum лучше.

teadrinker пишет:

Почему производительнее — не понимаю, там ведь лишнее действие

Массив один раз строится (предвычисление), а затем скорость получения n-го элемента не зависит от n.
В случае с for для n-ного элемента цикл совершит n итераций. Хотя в случае с небольшим количеством это роли не играет. Да и воoбще, как уже было сказано не раз, в списке причин для использовония autohotkey производительность находится далеко не в самом верху.

30

Re: AHK: Рандомизация значений параметров команд

serzh82saratov пишет:

Создание строки условий для например 50 координат, и в будущем правка пары значений, то есть поиск где в массиве 22 и 39 ключ, и где их соответствие в строке условий, будет непростым.

Почему? Создание и проверку диапазонов значений можно ведь автоматизировать, причём в одном и том же цикле:

obj := {A: 2, B: 3, C: 5}

for k, v in obj, sum := 0
   sum += v

Random, rand,, 1.
for k, v in obj, prev := 0
    prev += v/sum   ; создаём диапазон для каждого ключа
until rand <= prev  ; и сразу проверяем, не попал ли rand в него
   
MsgBox, % k

Можно заметить, что этот вариант практически идентичен вышеприведённому алгоритму:

obj := {A: 2, B: 3, C: 5}
for k, v in obj, _sum := 0
   _sum += v

Random, peek, 1, _sum
for k, v in obj, sum := 0
   sum += v
until sum >= peek

MsgBox, % k

Проверяем правильность алгоритма:

obj := {A: 2, B: 3, C: 5}

for k, v in obj, sum := 0
   sum += v

test := {A: 0, B: 0, C: 0}
Loop % N := 10000  {
   Random, rand,, 1.
   for k, v in obj, prev := 0
      prev += v/sum
   until rand <= prev && test[k]++
}
   
MsgBox, % "A — " Round(test.A/N*100, 1) "%`nB — " Round(test.B/N*100, 1) "%`nC — " Round(test.C/N*100, 1) "%"

А теперь тебе вопрос на засыпку. Как с помощью твоего производительного способа можно рассчитать вероятность равную 1.5% ?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Рандомизация значений параметров команд

Ну по теме на вряд ли это требуется, если уже и диапазоны в 5% предлагаются. Ну а так или 15 из 1000, или 2 вариант. Но учитывая что теоретически Random из 5 может 5 пятёрок выдать, 3 из 5 я сам видел, то 0,5 процента просто ни на что не повлияет. Для такой точности есть алгоритм без возможности повтора вариантов в диапазоне.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: Рандомизация значений параметров команд

Не совсем понял, почему без возможности повторов.

SetBatchLines, -1
obj := {A: 1.5, B: 97, C: 1.5}

for k, v in obj, sum := 0
   sum += v

test := {A: 0, B: 0, C: 0}
Loop % N := 10**6  {
   Random, rand,, 1.
   for k, v in obj, prev := 0
      prev += v/sum
   until rand <= prev && test[k]++
}
   
MsgBox, % "A — " Round(test.A/N*100, 1) "%`nB — " Round(test.B/N*100, 1) "%`nC — " Round(test.C/N*100, 1) "%"

(Займёт какое-то время на выполнение.)

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

33

Re: AHK: Рандомизация значений параметров команд

Ну ты хватил на миллион, на тысячу в большинстве случаев как раз 0,5 процента погрешность.

Почему? Создание и проверку диапазонов значений можно ведь автоматизировать, причём в одном и том же цикле:

Собственно и спорить уже не о чем, вариант с процентами в массиве удобен и понятен, с портянкой условий был не айс.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34

Re: AHK: Рандомизация значений параметров команд

Я просто хотел показать, что вариант с диапазонами ничем не хуже других. Точнее, все наши варианты, если их достаточно сократить, становятся похожими друг на друга. И даже твой первый вариант по сути "недосокращённый" алгоритм Уолкера.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: Рандомизация значений параметров команд

Для меня, как для начинающего, более всего понятен код:

points := [ [200, 100], [300, 400], [500, 600] ]
Random, rand, 0.0, 1.0

if (rand < 0.2)
   i := 1
else if (rand >= 0.2 && rand < 0.5)
   i := 2
else
   i := 3

point := points[i]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

Даже сварганил для четырёх и пяти точек ^_^.  Всем спасибо господа.

Не знаю, не умею, но быстро учусь!

36

Re: AHK: Рандомизация значений параметров команд

Ну так разве как новичку обязательно знать как это работает, чтобы этим пользоватся?
Я вот например не изучал исходный код виндовс перед использованием.

points := {[200, 100]: 20, [300, 400]: 30, [500, 600]: 50} ; изменять только здесь, остальное не трогать.

for k, v in points, sum := 0
   sum += v 

1:: ; запуск подпрограммы
    Random, rand, , 1.
    for point, v in points, prev := 0
        prev += v/sum
    until rand <= prev  
    ; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
    MouseClick, R, point[1], point[2], 1, 100
    Return

Вот всё что нужно, чтобы добавить ещё одни координаты.

points := {[50, 50]: 10, [200, 100]: 20, [300, 400]: 30, [500, 600]: 40}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37

Re: AHK: Рандомизация значений параметров команд

Что и требовалось доказать - для пользователя лучше как проще (понять), а не как лучше. ))
Если уж и этот "наиболее понятный новичку" код копнуть, то не выглядит ли лишней двойная проверка?

else if (rand >= 0.2 && rand < 0.5)

Левая граница каждого интервала и так проверяется в предыдущем if.
Заодно и от абсолютных значений границ интервалов можно избавиться и для этого случая, как и для уже предложенных ранее.
Пример для 5 точек, с распределением 10 - 40 - 30 - 2.5 - 17.5 %

points := [ [200, 100], [300, 400], [500, 600] ] ; добавить для 4 и 5 точек
Random, rand, 0.0, 1.0

if      (rand < t:= 0.1)
   i := 1
else if (rand < t+= 0.4)
   i := 2
else if (rand < t+= 0.3)
   i := 3
else if (rand < t+= 0.025)
   i := 4
else
   i := 5

point := points[i]
; CoordMode, Mouse, Screen  ; раскомментировать, если координаты относительно экрана
MouseClick, R, point[1], point[2], 1, 100

Проверка:

SetBatchLines -1
Arr := [0,0,0,0,0]
loop 100000 {
Random, rand, 0.0, 1.0

if      (rand < t:= 0.1)
   Arr[1]++
else if (rand < t+= 0.4)
   Arr[2]++
else if (rand < t+= 0.3)
   Arr[3]++
else if (rand < t+= 0.025)
   Arr[4]++
else
   Arr[5]++
}
MsgBox % Arr[1] "  " Arr[2] "  " Arr[3] "  " Arr[4] "  " Arr[5]