Страницы: 1 2 След.
RSS
Генерация случайного числа
 
Но не просто.  
Число должно быть шестнацатиричное и тридцатидвухразрядное.  
Желательно на VBA, но и в ячейке тоже пойдет.  
 
А башка совсем не хочет варить после вчерашнего.
Bite my shiny metal ass!      
 
эм, я уже плохо разбираюсь в этом,    
 
давайте начнём с шестнадцатиричного )  
 
может так подойдёт?  
 
=ДЕС.В.ШЕСТН(СЛЧИС()*100)  
 
а про 32-хразрядное можно поподробнее? ))) А то знания все давно уже ушли от меня
 
оно должно получиться например таким:  
E7A0F98BC3E64201B1C2D594A0EF380F  
32 знака не больше и не меньше.  
id генерю
Bite my shiny metal ass!      
 
Павел, с Вашей помощью получилось так:  
=ЛЕВСИМВ(ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#")&ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#")&ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#")&ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#")&ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#");32)  
функция ДЕС.В.ШЕСТН выдает #число если ей подсунуть больше 100000000000  
На выходе одной ТЕКСТ(ДЕС.В.ШЕСТН(СЛЧИС()*100000000000);"#") получается строка до 9 символов. Беру с запасом, потом отрезаю. Бредово, конечно...  
Может кто получше предложит...
Bite my shiny metal ass!      
 
Sub Макрсо1()  
  MsgBox BigNumber, , ""  
End Sub  
 
Function BigNumber() As String  
Const HexDigits As String = "0123456789ABCDEF"  
Dim Temp As String  
   Randomize  
   Do While Len(Temp) < 32  
       Temp = Mid(HexDigits, Int(16 * Rnd) + 1, 1) & Temp  
   Loop  
   BigNumber = Temp  
End Function
 
Вау, спасибо!  
Все оказалось просто.  
Только зачем нужна Temp?  
Вроде можно и без нее обойтись.  
Все равно спасибо.
Bite my shiny metal ass!      
 
Давайте сделаю без Temp )  
 
 
Sub Макрсо1()  
   MsgBox BigHexNumber, , ""  
End Sub  
 
Function BigHexNumber() As String  
Const HexDigits As String = "0123456789ABCDEF"  
   Randomize  
   Do While Len(BigHexNumber) < 32  
       BigHexNumber = Mid(HexDigits, Int(16 * Rnd) + 1, 1) & BigHexNumber  
   Loop  
End Function
 
а зачем каждый раз проверять длину?  
разве есть сомнение, что 32 раза по одному символу дадут именно 32 символа? :)  
 
For i = 1 To 32  
s = s & Hex(Int(Rnd() * 16))  
Next
Живи и дай жить..
 
Слэн,  
 
1) так придётся заводить ещё одну переменную i.    
Но что будет эффективнее/быстрее переменная i или Len < 32 - большой вопрос  
Возможно вы и правы, я не знаю.    
 
Но мне кажется тут не такая большая/громоздкая функция, чтобы думать о скорости    
 
2) ваша предложенная конструкция вычисления случайного Int(Rnd() * 16) не даёт числа 16, т.е. никогда не будет задействована буква F, т.к до неё никогда мы не дойдём.  
 
Для проверки вы можете вставить формулу =ЦЕЛОЕ(СЛЧИС()*16) ячейку Excel и растянуть до конца листа и посмотреть максимальное значение. Максимальное значение всегда будет 15  
 
P.S. У тебя всегда будут замечания по моему коду ? ))
 
Чем бы уже трое Гуру не тешились, лищь бы на вопросы отвечали  
:)
 
)))
 
{quote}{login=Pavel55}{date=07.02.2009 09:03}{thema=}{post}Слэн,  
 
1) так придётся заводить ещё одну переменную i.    
Но что будет эффективнее/быстрее переменная i или Len < 32 - большой вопрос  
Возможно вы и правы, я не знаю.    
 
Но мне кажется тут не такая большая/громоздкая функция, чтобы думать о скорости    
 
2) ваша предложенная конструкция вычисления случайного Int(Rnd() * 16) не даёт числа 16, т.е. никогда не будет задействована буква F, т.к до неё никогда мы не дойдём.  
 
Для проверки вы можете вставить формулу =ЦЕЛОЕ(СЛЧИС()*16) ячейку Excel и растянуть до конца листа и посмотреть максимальное значение. Максимальное значение всегда будет 15  
 
P.S. У тебя всегда будут замечания по моему коду ? )){/post}{/quote}  
 
 
1 ну, мне кажется, определение длины, а затем сравнение всяко дольше ..  
к тому же, пусть не переменная, а константа, у вас заведена.  
 
2 щитаем шестнадцатеричные цифры(в середине):    
d-h-№  
0-0-1  
1-1-2  
2-2-3  
3-3-4  
4-4-5  
5-5-6  
6-6-7  
7-7-8  
8-8-9  
9-9-10  
10-a-11  
11-b-12  
12-c-13  
13-d-14  
14-e-15  
15-f-16 - нет?  
 
ps не знаю :). зависит от кода.
 
ах, ну да, всё правильно, прошу прощения )  
 
Ну, вот Лузеру на выбор 2 функции )
 
Интересно, а Лузера™ не смутит, что полученное число во всех предложенных методах не очень-то и случайное? Так, один и тот же символ может повториться раз 5, а какой и вообще не попадется. Для случайного при 32 всего из 16 возможных должно быть как при потопе: каждого по паре
 
ну а вот так одной строкой:  
 
Function hexrandid() As String  
hexrandid = Left( _  
Hex((Rnd() + 1) * 1000000000#) & _  
Hex((Rnd() + 1) * 1000000000#) & _  
Hex((Rnd() + 1) * 1000000000#) & _  
Hex((Rnd() + 1) * 1000000000#), 32)  
End Function  
 
без лишних переменных и циклов, да и количество операций поменьше..
Живи и дай жить..
 
Замечание остается в силе: первый запуск выявил 3 одинаковых символа в результате, что и понятно. По мне, так в данном случае эффективность важна в результате, а не в скорости. А что по Лузеру™, наверное, узнаем утром.
 
Ну вот и утро :)  
Про скорость: не важна абсолютно. Файлик с id  генерю один раз в месяц. Вообще файлов с id много, но их генерит спец ПО. Только с одним файлом оно не справляется, так как приходится в автоматически сгенеренные файлы вносить руками мелкие правки (крупные через ПО вносятся).  
В этом месяце, правда, пришлось два генерить - ПО упало вместе с ораклом. Решил не ждать пока поднимут, потому как в субботу могли сдаться и сказать, что смогут поднять только в понедельник.  
А "ворота закрылись" в субботу. Я отличился: закрылся последним в всей стране :)  
Про случайность: фиг его знает. Я раньше брал id из лишнего файлика сгенеренного ПО и вставлял руками в ячейку, которую потом макросом считывал. Надоело, решил сам создавать.  
Требования к id такие:  
Значение атрибута id корневого элемента < message > содержит уникальный идентификатор электронного документа (globally unique identifier (GUID)  
Что хотели сказать фиг его знает.  
Сколько я их видел - выглядят случайными.  
В следующем месяце попробую последний вариант слэна, он вроде самый короткий. Особенно если заменить 1000000000 на 1Е10  
Так и перенос строк не понадобится.  
Еще раз спасибо за участие.
Bite my shiny metal ass!      
 
Обидно, но не вышла замена 1000000000 на 1Е10. Эксель сам обратно меняет.  
Про GUID пишет вики: http://ru.wikipedia.org/wiki/GUID  
и нарыл онлайновый генератор: http://www.randomguid.com/
Bite my shiny metal ass!      
 
слэн, в чем смысл решетки на конце 1000000000#?  
и без нее результат тот же вроде.
Bite my shiny metal ass!      
 
> Лузер™: Только зачем нужна Temp? Вроде можно и без нее обойтись.  
> Pavel55: Давайте сделаю без Temp )  
 
> Лузер™: слэн, в чем смысл решетки на конце 1000000000#? и без нее результат тот же вроде.  
> Слэн: ... (догадаемся, что ответит, или подождем до обеда? :)  
 
Чувствую, нарвусь я на комплименты всех троих. Пойду как я лучше сам... до обеда хотя бы :)
 
{quote}{login=:)}{date=08.02.2009 03:00}{thema=}{post}Интересно, а Лузера™ не смутит, что полученное число во всех предложенных методах не очень-то и случайное? Так, один и тот же символ может повториться раз 5, а какой и вообще не попадется. Для случайного при 32 всего из 16 возможных должно быть как при потопе: каждого по паре{/post}{/quote}  
 
не вижу логики?  
 
вы же не требуете от rnd, чтобы цифры не повторялись?  
 
как раз наоборот, такое ограничение даст более предсказуемый результат(или, другими словами, менее случайный) - посчитайти сами количество возможных комбинаций тут и там..
 
{quote}{login=:)}{date=08.02.2009 10:53}{thema=}{post}> Лузер™: Только зачем нужна Temp? Вроде можно и без нее обойтись.  
> Pavel55: Давайте сделаю без Temp )  
 
> Лузер™: слэн, в чем смысл решетки на конце 1000000000#? и без нее результат тот же вроде.  
> Слэн: ... (догадаемся, что ответит, или подождем до обеда? :)  
 
Чувствую, нарвусь я на комплименты всех троих. Пойду как я лучше сам... до обеда хотя бы :){/post}{/quote}  
 
отвечаю - так быстрее :)
 
вот три варианта:  
Sub Макрос3()  
Dim i&, t As Single, hexrandid As String  
t = Timer  
For i = 1 To 9 '99999  
'hexrandid = Left( _  
'Hex((Rnd() + 1) * 1000000000#) & _  
'Hex((Rnd() + 1) * 1000000000#) & _  
'Hex((Rnd() + 1) * 1000000000#) & _  
'Hex((Rnd() + 1) * 1000000000#), 32)  
'hexrandid = Left( _  
'Mid(Hex((Rnd() + 1) * 1000000000#), 2, 99) & _  
'Mid(Hex((Rnd() + 1) * 1000000000#), 2, 99) & _  
'Mid(Hex((Rnd() + 1) * 1000000000#), 2, 99) & _  
'Mid(Hex((Rnd() + 1) * 1000000000#), 2, 99), 32)  
hexrandid = Left( _  
Hex((Rnd() + Rnd() * 9 + 1) * 1E+07!) & _  
Hex((Rnd() + Rnd() * 9 + 1) * 1E+07!) & _  
Hex((Rnd() + Rnd() * 9 + 1) * 1E+07!) & _  
Hex((Rnd() + Rnd() * 9 + 1) * 1E+07!) & _  
Hex((Rnd() + Rnd() * 9 + 1) * 1E+07!), 32)  
Next  
Debug.Print Timer - t, hexrandid  
End Sub  
 
последние два "более случайны", первый быстрее.  
еще было бы быстрее использовать в первом варианте ! вместо #, но точность не позволяет, тогда все id будут заканчиваться на ноль(или несколько)  
 
кто не догадался - эти значки определяют тип данных. В формулах постоянно используются неявные преобразования данных.. так вот - без преобразований быстрее.  
rnd возвращает single. нам надо получить 32 знака. 4х8 не годится, так как числа могут получаться и короче, надо брать с запасом(и все равно гарантии нет, но вероятность большая)  
берем 4х9(или 5х7 - но дольше) - больше не получается - переполнение.  
в принципе, можно было бы работать с decimal, но в ячейках все равно отбражается только 15знаков, так что преобразования в string не избежать..  
 
теперь будем ждать ZVI - что он скажет, если заинтересуется, конечно :)
Живи и дай жить..
 
{quote}{login=}{date=08.02.2009 11:19}{thema=Re: }{post}{quote}{login=:)}{date=08.02.2009 03:00}{thema=}{post}Интересно, а Лузера™ не смутит, что полученное число во всех предложенных методах не очень-то и случайное? Так, один и тот же символ может повториться раз 5, а какой и вообще не попадется. Для случайного при 32 всего из 16 возможных должно быть как при потопе: каждого по паре{/post}{/quote}  
не вижу логики?  
 
вы же не требуете от rnd, чтобы цифры не повторялись?  
 
как раз наоборот, такое ограничение даст более предсказуемый результат(или, другими словами, менее случайный) - посчитайти сами количество возможных комбинаций тут и там..{/post}{/quote}  
Так..., кто-то таки нарвался.  
Количество комбинаций это не критерий равномерного случайного распределения.  
Напомню, что равномерное случайное распределение на отрезке [a,b] характеризуется вполне определенными параметрами, например, матожиданием, равным (a+b)/2.
Имеем 32 значения из набора 16-ти чисел от a=0 до b=15 (F). Если Ваш алгоритм выдает 4 одинаковых значения, то он должен позаботиться о том, чтобы в наборе матожидание и другие параметры равномерного распределения все равно соответствовали бы критериям этого вида распределения и именно в заданном диапазоне чисел.  
В приведенных алгоритмах следов борьбы за равномерность в математическом смысле не замечено. Впрочем, если все устраивает, то и ломать копья ни к чему - сдаюсь :) ... до обеда.  
 
> вы же не требуете от rnd, чтобы цифры не повторялись?  
 
Как это не требую? Запишите в Excel 2003 в ячейки A1:A65536 формулу =СЛЧИС() и попробуйте найти 2 одинаковых.
 
Справедливости ради отмечу, что если речь шла о генерации одного числа, записанного Hex-кодом, тогда здесь все не правы, и я тоже, так как в таком случае нужен более честный алгоритм генерации случайных чисел, коих в общем-то немало описано.
 
Лузер, а может написать код, который будет брать из инета GUID с сайта, который вы предложили? http://www.randomguid.com/  
 
Я думаю так нас всех устроит уникальность ID )  
 
Скорость будет низкая, но зато уникальность будет выше )  
 
Если это заинтересует вас, то напишите тут, а мы поможем с написанием кода для сайта)
 
мне просто любопытно.  
а можно создать приличный массив из случайных данных и потом из него в случайном порядке выдергивать сивмолы.
 
{quote}{login=}{date=08.02.2009 01:39}{thema=}{post}мне просто любопытно.  
а можно создать приличный массив из случайных данных и потом из него в случайном порядке выдергивать сивмолы.{/post}{/quote}  
 
Так мы вроде так и делали сперва  
 
вот массив  
Const HexDigits As String = "0123456789ABCDEF"  
 
вот выдёргиваем случайные символы из него  
BigHexNumber = Mid(HexDigits, Int(16 * Rnd) + 1, 1) & BigHexNumber  
 
Или вы что-то другое имеете ввиду?  
 
У Лузера же должны быть числа шестнадцатеричные, т.е. от 0 до F
 
{quote}{login=}{date=08.02.2009 01:39}{thema=}{post}мне просто любопытно.  
а можно создать приличный массив из случайных данных и потом из него в случайном порядке выдергивать сивмолы.{/post}{/quote}  
Конечно можно, например, записать в 2 мерный массив:  
в 1-ю размерность символы: 0123456789ABCDEF0123456789ABCDEF  
во 2-ю размерность - числа Rnd.  
Затем отсортировать по 2-й размерности и выдать то, что получилось в 1-й.  
но это как раз и будет вариант, на который я и намекал.
 
я говорил про цифры, а не числа - есть разница.  
 
вообще, если строка s состоит из подстрок s1..sn подстроки не повторяются(т.к. получаются из rnd)? то каким образом могут повторяться эти составные строки?  
 
видимо мы говорим про разное..  
 
но и ячейки заполнил(как раз посчиталось) - не повторяются
Живи и дай жить..
Страницы: 1 2 След.
Читают тему
Наверх