Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вернуть рандомную фразу

Ответить
Настройки темы
[решено] Вернуть рандомную фразу

Аватара для FlatX007

Ветеран


Сообщения: 553
Благодарности: 87

Профиль | Отправить PM | Цитировать


Как вернуть рандомное число извесно, а как вернуть "фразу" из рандомных букв ?

У меня предположение я не пробовал ещё - нужно вернуть рандомное число от 1 до 33 и к каждой цифре приравнять букву из алфавита по порядковому номеру, потом "сумировать" комбинации. Если так то пример ненадо я сам придумаю.

Меня интересует есть ли другой способ

Отправлено: 07:32, 09-07-2009

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для tweakos

Старожил


Автор проектов


Сообщения: 374
Благодарности: 128

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
Это то что я делаю в своём примере. Но по всей видимости, простота не нужна »
я всего лишь показал способ без использования функций....и не утверждаю что он лучше...но он действительно немного проще....

-------
Аддон [XpAnimateStyle] Анимированные вход/перезагр/выкл в WinXp / New Autorun Construct Alpha
/
LogonUI&Logo Changer / Theme patcher программа изменения элементов тем оформления
/
персонализация (смена обоев через фэйд)


Отправлено: 11:22, 11-07-2009 | #22


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
по всей видимости, простота не нужна »
угу, такие случаи надо оговаривать заранее...

На самом деле, MT19937, используемый в AutoIT - алгоритм ПСЕВДОслучайных чисел, где ВСЯ последовательность полностью задаётся ОДНИМ входным 32-х битным числом - чем больше у нас "в кармане" сгенерированных чисел из одной последовательности, тем ближе мы к оценке исходного "ключа". Сам "ключ" обычно генерится на основе показаний внутренних часов. Отсюда понятно, что для серьезных задач штатный генератор не подходит - только для тестирования своего кода... кстати, по указанному линку есть полезная сравнительная табличка разных алгоритмов.

P.S. Т.о., максимальное "пространство атаки" составляет у нас всего 32 бита и не зависит от длины пароля!

P.P.S. Генератор случайных чисел в Windows оказался не случайным

Последний раз редактировалось amel27, 11-07-2009 в 15:41. Причина: З.Ы.


Отправлено: 13:20, 11-07-2009 | #23


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R, я тоже это заметил при отладке UDF: для того, чтобы каждый процесс имел свою уникальную "случайную последовательность", пауза между запусками должна быть больше определенного интервала (~500мс)

Мне вообще не нравится, как реализован Rundom() в AutoIT. ИМХО программист сам должен выполнять инициализацию случайной последовательности, как это делается в других языках... Иначе вся работа Rundom() оказывается жестко привязана к времени запуска скрипта - глупость несусветная, вся фишка "воспроизводимости" коту под хвост... Кроме того, создается ложный миф "случайности" полученных чисел.

Отправлено: 08:13, 12-07-2009 | #25


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R, у меня вроде нормально, попробуй измененный вариант... а вообще, в таких случаях нужно проверить UDF для бинарной строки - там возвращается расширенный код ошибки GetLastError()

ADD: т.к. первая UDF лишь враппер - сделал возврат ошибок одинаковым

Последний раз редактировалось amel27, 13-07-2009 в 10:34.


Отправлено: 09:42, 13-07-2009 | #28


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
попробуй измененный вариант »
@error = 2
@extended = 87



Мда, это под AutoIt 3.2.8.1 - Под 3.3.0.0 нормально работает. Интересно, а под 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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вернуть рандомную фразу

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - [решено] Как вернуть экран приветствия 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




 
Переход