|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вернуть рандомную фразу |
|
[решено] Вернуть рандомную фразу
|
![]() Ветеран Сообщения: 553 |
Как вернуть рандомное число извесно, а как вернуть "фразу" из рандомных букв ?
У меня предположение я не пробовал ещё - нужно вернуть рандомное число от 1 до 33 и к каждой цифре приравнять букву из алфавита по порядковому номеру, потом "сумировать" комбинации. Если так то пример ненадо я сам придумаю. Меня интересует есть ли другой способ ![]() |
|
Отправлено: 07:32, 09-07-2009 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата tweakos:
![]() |
|
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 08:53, 11-07-2009 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 374
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
|
|
------- Отправлено: 11:22, 11-07-2009 | #22 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
На самом деле, MT19937, используемый в AutoIT - алгоритм ПСЕВДОслучайных чисел, где ВСЯ последовательность полностью задаётся ОДНИМ входным 32-х битным числом - чем больше у нас "в кармане" сгенерированных чисел из одной последовательности, тем ближе мы к оценке исходного "ключа". Сам "ключ" обычно генерится на основе показаний внутренних часов. Отсюда понятно, что для серьезных задач штатный генератор не подходит - только для тестирования своего кода... кстати, по указанному линку есть полезная сравнительная табличка разных алгоритмов. P.S. Т.о., максимальное "пространство атаки" составляет у нас всего 32 бита и не зависит от длины пароля! P.P.S. Генератор случайных чисел в Windows оказался не случайным ![]() |
|
Последний раз редактировалось amel27, 11-07-2009 в 15:41. Причина: З.Ы. Отправлено: 13:20, 11-07-2009 | #23 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27, Кстати, это (не надёжность генерации СЧ) и видно с простого примера, где два раза подряд возвращается одно и то же, якобы случайное число, и причём с разных процессов:
Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox(262144+64, ''Random Test 1'', ''Random: '' & Random(1, 5))"') Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox(262144+64, ''Random Test 2'', ''Random: '' & Random(1, 5))"') WinWait('Random Test 2') WinMove('Random Test 1', 'Random: ', (@DesktopWidth/2)-200, (@DesktopHeight/2)-40) WinMove('Random Test 2', 'Random: ', (@DesktopWidth/2)+100, (@DesktopHeight/2)-40) |
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 19:47, 11-07-2009 | #24 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R, я тоже это заметил при отладке UDF: для того, чтобы каждый процесс имел свою уникальную "случайную последовательность", пауза между запусками должна быть больше определенного интервала (~500мс)
Мне вообще не нравится, как реализован Rundom() в AutoIT. ИМХО программист сам должен выполнять инициализацию случайной последовательности, как это делается в других языках... Иначе вся работа Rundom() оказывается жестко привязана к времени запуска скрипта - глупость несусветная, вся фишка "воспроизводимости" коту под хвост... Кроме того, создается ложный миф "случайности" полученных чисел. |
Отправлено: 08:13, 12-07-2009 | #25 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать собственно, метод, рекомендуемый Microsoft (тот самый CryptoAPI):
ConsoleWrite(_Crypto_GetRandomString(12, 7) &@CRLF) ; ============================================================================= ; _Crypto_GetRandomString($iLen[, $iFlag]) ; ----------------------------------------------------------------------------- ; Получение случайной символьной строки заданной длины ; ; $iLen : длина получаемой строки ; $iFlag : какие символы используются при генерации строки ; : 1 - цифры ; : 2 - большие английские буквы ; : 4 - малые английские буквы ; : 8 - основные спецсимволы ; : 16 - дополнительные спецсимволы ; : 32 - русские буквы ; ; При успехе : возвращает бинарную строку ; ; При неудаче : пустая строка: ; : @error, @extended - код ошибки _Crypto_GetRandomBinary() ; ; : AutoIT v3.3.0.0 ; ============================================================================= Func _Crypto_GetRandomString($iLen, $iFlag = 15) Local $iMid, $sABC = "", $sOut = "" If BitAND($iFlag,1) Then $sABC &= "0123456789" If BitAND($iFlag,2) Then $sABC &= "ABCDEFGHIJKLMNOPQRSTUVWXYZ" If BitAND($iFlag,4) Then $sABC &= "abcdefghijklmnopqrstuvwxyz" If BitAND($iFlag,8) Then $sABC &= "~!@#$%^&*()_" If BitAND($iFlag,16) Then $sABC &= '`+-=",.<>/?\|[]{};:'&"'" If BitAND($iFlag,32) Then $sABC &= 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя' Local $iABC = StringLen($sABC) Local $bPWD = _Crypto_GetRandomBinary($iLen) If @error Then Return SetError(@error, @extended, $sOut) ; Ошибка _Crypto_GetBinary For $i=1 To BinaryLen($bPWD) $iMid = Int(BinaryMid($bPWD,$i,1))*$iABC/0x100+1 $sOut &= StringMid($sABC, $iMid, 1) Next Return $sOut EndFunc ; ==> _Crypto_GetRandomString ; ============================================================================= ; _Crypto_GetRandomBinary($iLen) ; ----------------------------------------------------------------------------- ; Получение случайной строки байтов заданной длины ; ; $iLen : количество байтов в бинарной строке ; ; При успехе : возвращает бинарную строку ; ; При неудаче : возвращаемое значение не является бинарной строкой: ; : @error=1, @extended=1 - ошибка открытия advapi32.dll ; : @error=1, @extended=2 - ошибка открытия kernel32.dll ; : @error=2 - RunTime ошибка API, @extended - код ошибки ; ; : AutoIT v3.3.0.0 ; ============================================================================= Func _Crypto_GetRandomBinary($iLen) Local $phProv = DllStructCreate("ulong_ptr"), $aRet Local $pbBuffer = DLLStructCreate("byte[" & $iLen & "]") ; Открытие DLL Local $hAdvApi = DllOpen("advapi32.dll"), $hKernel = DllOpen("kernel32.dll") If $hAdvApi=-1 Then Return SetError(1, 1, DllClose($hKernel)) ; Ошибка открытия advapi32.dll If $hKernel=-1 Then Return SetError(1, 2, DllClose($hAdvApi)) ; Ошибка открытия kernel32.dll ; Создание описателя криптохранилища $aRet = DllCall($hAdvApi, "int", "CryptAcquireContext", _ "ptr", DllStructGetPtr($phProv), "ptr", 0, "ptr", 0, "dword", 1, "dword", 0xF0000000) If $aRet[0]=0 Then $aRet = DllCall($hKernel, "int", "GetLastError") If UBound($aRet)=1 And $aRet[0]=0x80090016 Then $aRet = DllCall($hAdvApi, "int", "CryptAcquireContext", _ "ptr", DllStructGetPtr($phProv), "ptr", 0, "ptr", 0, "dword", 1, "dword", 0xF0000008) If $aRet[0]=0 Then $aRet = DllCall($hKernel, "int", "GetLastError") EndIf If UBound($aRet)>1 Then ; Генерация случайной последовательности байтов $aRet = DllCall($hAdvApi, "int", "CryptGenRandom", _ "ptr", DllStructGetData($phProv, 1), "dword", $iLen, "ptr", DllStructGetPtr($pbBuffer)) If $aRet[0]=0 Then $aRet = DllCall($hKernel, "int", "GetLastError") ; Закрытие описателя криптохранилища DllCall($hAdvApi, "long", "CryptReleaseContext", _ "ulong_ptr", DllStructGetData($phProv, 1), "dword", 0) EndIf DllClose($hKernel) DllClose($hAdvApi) If UBound($aRet)=1 Then Return SetError(2, $aRet[0], 0) ; Ошибка API RunTime Return DllStructGetData($pbBuffer, 1) ; Возврат строки EndFunc ; ==> _Crypto_GetRandomBinary |
Последний раз редактировалось amel27, 13-07-2009 в 10:32. Причина: изменена обработка ошибок Отправлено: 18:23, 12-07-2009 | #26 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27, Что-то у меня функция возвращает ошибку (@error = 1, @extended = 1)...
|
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 22:58, 12-07-2009 | #27 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R, у меня вроде нормально, попробуй измененный вариант...
ADD: т.к. первая UDF лишь враппер - сделал возврат ошибок одинаковым |
Последний раз редактировалось amel27, 13-07-2009 в 10:34. Отправлено: 09:42, 13-07-2009 | #28 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата amel27:
@extended = 87 ![]() Мда, это под AutoIt 3.2.8.1 ![]() |
|
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 15:36, 13-07-2009 | #29 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Оно работает в обеих версиях если заменить "ulong_ptr" на "long" (или на "ptr"). Но насколько оно будет надёжно?
P.S Кстати, а таким же методом, можно сделать UDF-аналог на Random(), т.е чтобы более надёжно возвращать случайное число? |
------- Альберт Эйнштейн P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©» http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community Отправлено: 15:55, 13-07-2009 | #30 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - [решено] Как вернуть экран приветствия | BencX | Microsoft Windows 2000/XP | 22 | 24-01-2015 10:39 | |
Загрузка - [решено] Как вернуть картинку загрузки? | dimx | Microsoft Windows 7 | 25 | 20-12-2010 15:26 | |
Интерфейс - [решено] Вернуть в стандартный вид значки | lolik119 | Microsoft Windows 2000/XP | 4 | 24-07-2009 19:36 | |
[решено] Как вернуть расширение файлу? | vof44ik | Хочу все знать | 8 | 14-06-2009 00:12 | |
[решено] Сжатые файлы:как вернуть | typus | Microsoft Windows 2000/XP | 2 | 10-03-2007 01:26 |
|