Показать полную графическую версию : [решено] Вернуть рандомную фразу
FlatX007
09-07-2009, 07:32
Как вернуть рандомное число извесно, а как вернуть "фразу" из рандомных букв ?
У меня предположение я не пробовал ещё - нужно вернуть рандомное число от 1 до 33 и к каждой цифре приравнять букву из алфавита по порядковому номеру, потом "сумировать" комбинации. Если так то пример ненадо я сам придумаю.
Меня интересует есть ли другой способ ;)
FlatX007, а что подразумевается под фразой "из рандомных букв"?.. как раз то, что описано ниже ;)
FlatX007
09-07-2009, 12:00
wesadczgcgjbnzytuyiuopmjouitfhg - "фраза" из рандомных букв что непонятного ?
У меня предположение я не пробовал ещё - нужно вернуть рандомное число от 1 до 33 и к каждой цифре приравнять букву из алфавита по порядковому номеру, потом "сумировать" комбинации. Если так то пример ненадо я сам придумаю. »
помойму это единственный вариант, после генерации либо:
- StringMid
- Chr
- либо извращения, выборка из массива...
FlatX007, все как раз понятно: "вернуть фразу из рандомных букв" это то же самое, что:
вернуть рандомное число от 1 до 33 и к каждой цифре приравнять букву из алфавита по порядковому номеру, потом "сумировать" комбинации
т.е. это не "способ", а другая формулировка той же задачи :)
сравни с формулировкой: "вернуть рандомную фразу из заданных букв" - это уже другая задача
P.S. это не флуд, а занудство ;) ...сам сказал - другие способы не интересуют
Давайте закидаем Амеля27 снежками :tomato2: - он много знает ... :happy:
FlatX007
09-07-2009, 14:38
amel27 »
Меня интересует есть ли другой способ »
..сам сказал - другие способы не интересуют »
Где логика ? :tomato: :tomato:
$sRandomString = _StringGetRandomString(15, 20, 1)
MsgBox(64, 'Title', $sRandomString)
Func _StringGetRandomString($iMin=1, $iMax=1, $iOnly_ASCII=0)
If $iMax < $iMin Then Return SetError(1, 0, 0)
Local $iRandom, $sRet_Str = ''
Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122
For $i = 1 To Random($iMin, $iMax, 1)
$sRet_Str &= Chr(Random($iMin_Rndm, $iMax_Rndm, 1))
Next
Return $sRet_Str
EndFunc
FlatX007
09-07-2009, 15:19
некак непойму зачем эти строчки
Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122
If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122 »
Dim тут для того, что бы объявить заново переменные $iMin_Rndm и $iMax_Rndm.
а так как это можно сдлеать в одну строчку, то можно не расписывать:
If $iOnly_ASCII Then
$iMin_Rndm = 97
$iMax_Rndm = 122
EndIf
Хитро ;) Только есть ли скрытый смысл в использование Dim? Может тот же Local?
А $iMin_Rndm = 97 и $iMax_Rndm = 122 - это значит произвести выборку только среди английского алфавита маленьких букавак: a-z
есть ли скрытый смысл в использование Dim? »
Какой скрытый смысл? переменные уже объявлены в локальном скупе, а Dim позволяет присвоить значение нескольким переменным сразу, при этом не меняя локального скупа.
FlatX007
09-07-2009, 15:54
Так оно работает и без Local $iMin_Rndm = 33, $iMax_Rndm = 255
А если убрать строчку If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122 - то получается гинератор крокозябр :) просто несталкивался с функцией Chr на практике - вот и задаю глупые вопросы.
при этом не меняя локального скупа. »
вот эотго не понимаю.
чем это:
Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122
т.е. при этом, не будут объявляться новые переменные, т.к. будет определенно, что они уже существуют и им просто будет присвоенно новое значение?
будет отличаться от этого:
Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Local $iMin_Rndm = 97, $iMax_Rndm = 122
а в этом случае, невзирая, что эти переменные уже существуют, они снова будут объявленны и им будет присвоенно соотсвтевующее значение...
так?
Так оно работает и без Local $iMin_Rndm = 33, $iMax_Rndm = 255 »
Ну попробуй вместо 1 поставить 0 при вызове функции (последний параметр) ;)
если убрать строчку If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122 - то получается гинератор крокозябр »
Не надо ничего убирать, это можно сделать и через параметр $iOnly_ASCII = 0. Если он будет равен 1, то будет гинерировать только ASCII символы.
чем это:
Цитата:Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Dim $iMin_Rndm = 97, $iMax_Rndm = 122
будет отличаться от этого:
Цитата:Local $iMin_Rndm = 33, $iMax_Rndm = 255
If $iOnly_ASCII Then Local $iMin_Rndm = 97, $iMax_Rndm = 122
? »
Ничем, оба варианта работают одинаково. Я вот другого не понимаю, зачем придираться к этим мелочам, не в этом же суть функции.
Ничем, оба варианта работают одинаково. Я вот другого не понимаю, зачем придираться к этим мелочам, не в этом же суть функции. »
нееее. я не придираюсь - я изучаю, мнеж не понятно. думал что в этом есть реально смысл, который я непомниаю. я бы Local написал бы без задней мысли...а тут Dim - вот и удивился ....)
proxy,
Из справки:
The difference between Dim, Local and Global is the scope in which they are created:
Dim = Local scope if the variable name doesn't already exist globally (in which case it reuses the global variable!)
Global = Forces creation of the variable in the Global scope
Local = Forces creation of the variable in the Local/Function scope
You should use Local or Global, instead of Dim, to explicitly state which scope is desired for a variable/constant/array.
Т.е в нашем случае, оно не играет особой роли, вот если бы эти переменные были заранее объявлены глобально, то Local в функции создал бы точно такие переменные с локальным скупом, а Dim оставил бы скуп как есть, только переназначил бы значения.
Где логика »ладно, проехали... ;)
Максимально случайным будет только первый вызов Random(), случайность всех последующих вызовов будет существенно ниже – реальная величина зависит от применяемого алгоритма генератора СЧ. Т.к. максимально целое случайное число является 31-разрядным, длина максимально-случайного слова вычисляется формулой 31*ln2/lnN, где N – кол-во букв в алфавите. Для 33 русских букв одного регистра - это слово из 6 букв. Т.е. для максимально случайной фразы мы должны генерировать не по одной букве, а по 6-символьным последовальностям, при этом каждые 5 битов числа будут кодировать одну букву.
P.S. вся эта “нудь” имеет смысл только при решении задач типа генераторов паролей, чтобы точно знать РЕАЛЬНУЮ сложность сгенерированного пароля
FlatX007
09-07-2009, 19:40
Нащёт моего примера в шапке я и так знаю Максимально случайным будет только первый вызов Random(), » - поэтому и попросил помочь. :Р а из формулы я ничего непонял.
FlatX007, можно уменьшить кол-во вызовов Random():
$p = _GetRandomString(10)
$e = @extended
ConsoleWrite("Password: "& $p &@CRLF)
ConsoleWrite("Skipped : "& $e &" chars"&@CRLF)
Func _GetRandomString($iLen, $sABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_@")
Local $iABC = StringLen($sABC), $sOut = ""
Local $iBit = Int(Log($iABC)/Log(2)) ; бит на символ
Local $iMsk = BitShift(1,-$iBit) -1 ; битовая маска
Local $iChr = Int(31/$iBit) ; символов на одно случайное число
While 1
$iRnd = Random(1, 0x7FFFFFFF, 1)
For $i=1 To $iChr
$sOut &= StringMid($sABC, BitAND($iRnd, $iMsk)+1, 1)
If StringLen($sOut)>=$iLen Then Return SetError(0, $iABC-$iMsk-1,$sOut)
$iRnd = BitShift($iRnd, $iBit)
Next
WEnd
EndFunc
ADD: кол-во символов должно быть равно степени двойки (32, 64,...), иначе строка обрезается до ближайшей такой
FlatX007, Есть способ гораздо проще:
$1=random("65","95")
$2=random("65","95")
$3=random("65","95")
$4=random("65","95")
$5=random("65","95");здесь записываем необходимое кол-во рандомных цифр
$result=(chr($1)&chr($2)&chr($3)&chr($4)&chr($5));обьеденяем фразу ,посредством chr переводим цифру в букву
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.