Страницы: 1
RSS
Генерация случайных чисел и цифр по заданному шаблону
 
Подскажите формулу, которая генерировала бы строку по заданному шаблону: буквы A-F, цифры 0-9, длиной 32 символа.

В данный момент для этой цели пользуюсь shell-скриптом:
Цитата
if [ $input == Y ]; then
for i in {1..10}; do tr -dc 'ABCDEF1234567890' < /dev/urandom | head -c 32 | xargs;
done
Нужный результат:
Код
1032414AEE8933E9826CB2DD49C6270F
B3F309F95AE86235D1B576146D238195


Можно ли решить данную задачу макросом или еще лучше, формулой?
Загуглил и нашел такой макрос:
Код
Public Function GeneratePDF(Optional Lenght As Integer = 32)
   For s = 1 To Lenght
       choice = Int(Rnd * 3)

       If choice = 0 Then
           nextsymbol = Int(Rnd * 9)
       End If

       If choice = 1 Then
           nextsymbol = Chr(Int((70 - 65 + 1) * Rnd + 65))
       End If

       PassTxt = PassTxt & nextsymbol
   Next s

   GeneratePDF = PassTxt
End Function

И он должен работать, но результат (ниже) почему-то не похож на то, что выдает мой случайный скрипт
Код
FE00FFFF72884B1DD1C78EECDAA13F80
1172DAAC8CC47DAA13333E0DDD8E466

Какой-то не случайный и много повторений. Помогите?
Изменено: Jake - 15.02.2020 19:59:26
 
Доброе время суток
Попробуйте так
Код
Public Function GetRandom(Optional ByVal Length As Long) As String
    Const base = "0123456789ABCDEF"
    Dim i As Long, sResult As String
    Math.Randomize
    For i = 1 To Length
        sResult = sResult & Mid$(base, Math.Round(1# + 15# * Math.Rnd, 0), 1)
    Next
    GetRandom = sResult
End Function

Формула для одного символа
Код
=ПСТР("0123456789ABCDEF";СЛУЧМЕЖДУ(1;16);1)
 
Андрей VG,

Идеально, спасибо вам!
 
Цитата
Jake написал:
Идеально,
Если вы про VBA, то нет. Так будет лучше
Код
Public Function GetRandom(Optional ByVal Length As Long) As String
    Const base = "0123456789ABCDEF"
    Dim i As Long, sResult As String
    Math.Randomize
    For i = 1 To Length
        sResult = sResult & Mid$(base, Math.Round(0.50000000000001 + 15.999999999999 * Math.Rnd, 0), 1)
    Next
    GetRandom = sResult
End Function
 
Код
Function Rnd32$()
  Dim i&, a&
  For i = 1 To 32
    a = Int(17 * Rnd()): Rnd32 = Rnd32 & IIf(a < 10, a, Chr(55 + a))
  Next
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
вариант -
Код
  Dim i&
  
  For i = 1 To 8
    Rnd32 = Rnd32 & Format$(Hex(Int(65536 * Rnd())), "0000")
  Next
Изменено: Апострофф - 15.02.2020 15:44:30 (& format)
 
Андрей VG, Спасибо  :D

Ігор Гончаренко, попытка обращения к вашей функции с параметром и без них - выдает ошибку #ССЫЛКА!, я делаю что-то не так?
 
если посмотреть что вы делаете. можно сказать что вы делаете не так
а угадывать что вы делаете не так - не интересно

Апострофф,
Нех при небольших Rnd() не вернет лидирующих 0, и итоговая строка может оказать короче требуемых 32 символа
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, подскажете как правильно вызывать вашу функцию?
 
Цитата
Ігор Гончаренко написал:
Нех при небольших Rnd() не вернет лидирующих 0
А Format$(Hex - вернет.
Код
?Format$(Hex(0), "0000")
0000
;)
Можно и так записать (в ущерб скорости, наверно?)
Код
Function Rnd32$()
  Dim i&
  For i = 1 To 32
    Rnd32 = Rnd32 & Hex(Int(16 * Rnd()))
  Next
End Function
Изменено: Апострофф - 15.02.2020 19:44:43
 
А вот это
Цитата
Ігор Гончаренко написал:
a = Int(17 * Rnd())
может ещё и "G" вернуть :)  (17-я цифра 17-тиричной СС?)
 
Апострофф,
можно начинать эксперименты...
когда Int(17 * Rnd()) вернет 17, напишешь мне
(или без экспериментов читать мат часть раздел Rnd, там пишут что она может вернуть)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  Int(17 * Rnd()) возвращает значения от 0 до 16 (всего 17 штук) . Поверьте, я немного знаю матчасть.

эксперимент
 
Так куда мы "G" отнесём? На непредвиденные обстоятельства?
Или *16 правильнее будет в контексте задачи?
Изменено: Апострофф - 06.02.2021 17:52:12
 
=DEC2HEX(RANDBETWEEN(0;4294967295);8)&DEC2HEX(RANDBETWEEN(0;4294967295);8)&DEC2HEX(RANDBETWEEN(0;4294967295);8)&DEC2HEX(RANDBETWEEN(0;4294967295);8)
Изменено: БМВ - 06.02.2021 17:50:08
По вопросам из тем форума, личку не читаю.
 
БМВ, здарово!!!
Наверно можно и формулами. Но у меня аллергия на эту пакость.
 
Цитата
Апострофф написал:
Но у меня аллергия на эту пакость.
еще никогда медведя так не злили!!!!
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
еще никогда медведя так не злили!!!!
Крепись! Какие наши годы. Формулы - зло! Особо когда их мильоны на тыщах связанных листах :)  
 
Цитата
Ігор Гончаренко написал:
можно начинать эксперименты...когда Int(17 * Rnd()) вернет 17, напишешь мне
Зачем?
Дошкольники знают что в десятичной системе ДЕСЯТЬ цифр (0 to 9)
Чуть постарше (иногда) узнают про bin, oct, hex и т.п.
НО ЧТОБЫ  G стало цифрой в шестнадцатиричной системе? Это надо было постараться!
Страницы: 1
Наверх