AHK скрипт случайного массива
Скрипт должен вывести файл с именами в случайном порядке:
Gui, Add, Edit, x25 y25 h150 w200 vSN, Enter names here
Gui, Add, Edit, x25 y185 h25 w200 vRT, Project Name
Gui, Add, Button, x25 y225 h25 w200, Generate
Gui, Show, x375 y200 h270 w250, Area Assignment by PS Cebu Team
FormatTime, TimeString,, MM d, yyyy
return
ButtonGenerate:
Gui, Submit, NoHide
{
count := 1
StringSplit, lines, SN, `n
Loop, %lines0%
{
content := lines%a_index%
FileAppend, Area %count% --- %content% `n, %RT% - %TimeString%.txt
count++
}
return
guiclose:
exitapp
}
имена на выходе должны быть рандомизированы.
2 ответа
Использование:
Sort, SN, Random
Это отсортирует вашу строку случайным образом... После этого, именно тогда вы должны разделить ее.
Произвольная сортировка массива не так проста, поскольку в нем есть пары ключей и значений.
Поэтому мы пытаемся рандомизировать его, прежде чем преобразовать в массив.
Сортировка также по умолчанию для разделения новых строк. Но если вы хотите использовать пользовательский разделитель, используйте D
вариант. Подобно:
# this will sort a string delimited by a comma
Sort, SN, Random D,
Вот непроверенный код (потому что я не использую AHK), но он должен работать:
Gui, Add, Edit, x25 y25 h150 w200 vSN, Enter names here
Gui, Add, Edit, x25 y185 h25 w200 vRT, Project Name
Gui, Add, Button, x25 y225 h25 w200, Generate
Gui, Show, x375 y200 h270 w250, Area Assignment by PS Cebu Team
FormatTime, TimeString,, MM d, yyyy
return
ButtonGenerate:
Gui, Submit, NoHide
{
count := 1
# randomly sort the string delimited by `n first
Sort, SN, Random
# then convert it to the array
StringSplit, lines, SN, `n
Loop, %lines0%
{
content := lines%a_index%
FileAppend, Area %count% --- %content% `n, %RT% - %TimeString%.txt
count++
}
return
guiclose:
exitapp
}
Если вы программист объектно-ориентированного типа, вы также можете использовать фактические массивы в AHK_L:
SN = James`nJohn`nRobert`nMichael
nameArr := StrSplit(SN, "`n")
ArrayShuffle(nameArr)
for i, name in nameArr
{
FileAppend, Random name: %name%, somewhere.txt
}
; Fisher-Yates shuffle
ArrayShuffle(arr) {
i := arr.MaxIndex()
while(i > 1) {
Random, rnd, 1, % i
tmp := arr[rnd]
arr[rnd] := arr[i]
arr[i] := tmp
i--
}
return arr
}
Таким образом, вы можете управлять алгоритмом тасования, я использовал реализацию тасования Фишера-Йейтса. Вы также можете пойти дальше и использовать Arrays.ahk, добавив к нему функцию перетасовки.
PS:
Возможно, вам следует проверить правильность содержимого редактируемого имени проекта, поскольку вы используете их непосредственно в качестве имени файла. Если пользователь случайно введет недопустимый символ, ваша программа потерпит крах.