1 (изменено: Kapysta, 2014-01-30 18:54:14)

Тема: AHK: Как сделать Random без повтора ?

Здравствуйте, ув. пользователи данного форума. Нужна Ваша помощь. Решил сделать рандом, но у меня все время идут повторы чисел, что мне не нужно. Искал ответ, как можно сделать так, чтобы их не было - ничего не нашел. Если Вам не сложно, помогите мне. Вот, примерно такой скрипт у меня. Нужно сделать без повторов, если это возможно. Зарание спасибо


r::
l:
Random, rand, 1,10

if rand=1
Send, 1

if rand=2
Send, 2

if rand=3
Send, 3

if rand=4
Send, 4

if rand=5
Send, 5

if rand=6
Send, 6

if rand=7
Send, 7

if rand=8
Send, 9

if rand=9
Send, 9

if rand=10
Send, 10

Sleep, 1000

Goto, l

a::Pause

2

Re: AHK: Как сделать Random без повтора ?

у меня все время идут повторы, что мне не нужно

В каком смысле?

3 (изменено: Kapysta, 2014-01-30 18:59:24)

Re: AHK: Как сделать Random без повтора ?

ypppu пишет:

у меня все время идут повторы, что мне не нужно

В каком смысле?

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

4 (изменено: ypppu, 2014-01-30 19:11:42)

Re: AHK: Как сделать Random без повтора ?

Такой вариант должен подойти.

r::
Loop
{
Random, rand, 1, 10
If rand != %prev_rand%
    {
    Send, %rand%
    Sleep, 1000
    prev_rand = %rand%
    }
}

a::Pause

Добавлено: Так это, число не должно повторять одно предыдущее или все предыдущие числа?

5 (изменено: Kapysta, 2014-01-30 19:29:20)

Re: AHK: Как сделать Random без повтора ?

Как только я запустил скрипт, генерируются числа, которые приводят в действие что-то, в моем случае:

r::
l:
Random, rand, 1,10

if rand=1
Send, testone

if rand=2
Send, testtwo

if rand=3
Send, testthree

if rand=4
Send, testfour

if rand=5
Send, testfive

if rand=6
Send, testsix

if rand=7
Send, testseven

if rand=8
Send, testeight

if rand=9
Send, testnine

if rand=10
Send, testten

Sleep, 1000

Goto, l

a::Pause

Ранее я написал не так, как должно быть. Вы подумали, что мне нужны просто рандомные числа, но это не так.


Должен быть текст в рандомном порядке, но без повторов. Если уже сгенерировалось все 10 возможных текстов - бинд останавливается. В итоге должно быть 10 разных текстов без повторов, понимаете ? Перед тем, как делать генерацию рандомных действий, должна быть проверка на то, было ли уже использовано данное действие. Надеюсь, Вы понимаете о чем я.

6 (изменено: serzh82saratov, 2014-01-30 20:39:21)

Re: AHK: Как сделать Random без повтора ?


arr := [], i := 0

1::
Random: 
    If (i = 10) 
        arr := [], i := 0 ; строку заменить на "Return" если повтор не требуется
    Random, rand, 1, 10
    If arr[rand]
        GoTo Random
    arr[rand] := 1, i++
    ToolTip % r .= rand "`n" (i = 10 ? "`n" : "")
    Return

Или может так:



arr := [], i := 0
Action := ["testone", "testtwo", "testthree", "testfour", "testfive"
    , "testsix", "testseven", "testeight", "testnine", "testten"]
   
1::
Random: 
    If (i = 10)  
    {
        arr := [], i := 0, r := ""
        Return
    }    
    Random, rand, 1, 10
    If arr[rand]
        GoTo Random
    arr[rand] := 1, i++
    SendRaw % Action[rand] "`n" 
    Sleep, 1000
    GoTo Random 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Как сделать Random без повтора ?

Со списком проще всего, но я бы применил его таким образом:

Arr := ["testone", "testtwo", "testthree", "testfour", "testfive"
     , "testsix", "testseven", "testeight", "testnine", "testten"]
   
F1::
   tArr := Arr.Clone()
   While % i:=tArr.MaxIndex() {
      Random, i, 1, i
      Send % tArr[i] . "`n"
      tArr.Remove(i)
   }
Return

8

Re: AHK: Как сделать Random без повтора ?

но я бы применил его таким образом:

Я бы тоже, если бы догадался
Класс!

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

9 (изменено: Irbis, 2014-01-31 00:52:28)

Re: AHK: Как сделать Random без повтора ?

Алгоритмы - дело наживное, для этого и существуют форумы
Еще поправка к коду: оказывается (вполне логично), что метод Remove() возвращает удаленное значение, или же пустую строку, в случае неверного параметра. Так что обработку очередного элемента можно недрогнувшей рукой совместить с удалением этого элемента

F1::
   tArr := Arr.Clone()
   While % i:=tArr.MaxIndex() {
      Random, i, 1, i
      Send % tArr.Remove(i) . "`n"
   }
Return

Непонятно, в силу каких причин в AHK генерация псевдослучайных чисел не реализована в виде функции, ведь так было бы удобней. Приходится использовать функцию-"обертку" Rand(), без которой код сократился бы еще на несколько строк:

Arr := ["testone", "testtwo", "testthree", "testfour", "testfive"
     , "testsix", "testseven", "testeight", "testnine", "testten"]
   
F1::
   tArr := Arr.Clone()
   While % i:=tArr.Remove(Rand(tArr.MaxIndex()))
      Send % i . "`n"
Return

Rand(i) {
   Random, i, 1, i
   Return i
}

10 (изменено: serzh82saratov, 2014-01-31 16:20:27)

Re: AHK: Как сделать Random без повтора ?

Кстати для "простых случаев", можно и просто:


Str = testone|testtwo|testthree|testfour|testfive|testsix|testseven|testeight|testnine|testten 

1::
    Sort, Str, Random D|
    Loop, parse, Str, |
        SendInput % "{Raw}" A_LoopField "`n"
    Return

Или сократить для ещё более простых:


Str = testone`ntesttwo`ntestthree`ntestfour`ntestfive`ntestsix`ntestseven`ntesteight`ntestnine`ntestten 

1::
    Sort, Str, Random 
    SendInput % "{Raw}" Str
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11

Re: AHK: Как сделать Random без повтора ?

Здорово. А я и не вспомнил про такой вариант сортировки. Так еще проще и наглядней

12

Re: AHK: Как сделать Random без повтора ?

Ребята, большое Вам спасибо. Помогли! Взял себе вот это:

arr := [], i := 0
Action := ["testone", "testtwo", "testthree", "testfour", "testfive"
    , "testsix", "testseven", "testeight", "testnine", "testten"]
   
1::
Random: 
    If (i = 10)  
    {
        arr := [], i := 0, r := ""
        Return
    }    
    Random, rand, 1, 10
    If arr[rand]
        GoTo Random
    arr[rand] := 1, i++
    SendRaw % Action[rand] "`n" 
    Sleep, 1000
    GoTo Random 

Но хотелось бы еще кое что у Вас попросить, а именно: сделать так, чтобы перед тем как писать текст, который вписан в Action, нажималась кнопочка F6. Что-то такого:

Send, {F6}text{enter}

И еще, сделать так, чтобы можно было в любое время остановить бинд, после чего можно продолжить его. Зарание спасибо, ребята!

13 (изменено: serzh82saratov, 2014-02-01 21:53:07)

Re: AHK: Как сделать Random без повтора ?

чтобы перед тем как писать текст, который вписан в Action, нажималась кнопочка F6.

SendInput % "{F6}{Raw}" Str "`n" 

И еще, сделать так, чтобы можно было в любое время остановить бинд, после чего можно продолжить его.

Ну у тебя же в топике применено:

a::Pause

чем не устраивает?

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