Как создать случайную строку произвольной длины из алфавита?


Ответы:


14

основной

Предположим, вы хотите сгенерировать строку произвольной длины (1-8 символов) из строчных букв (az).

=LEFT( CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97),
       RAND()*8+1)

Каждый CHAR(...)генерирует 1 случайный алфавит в нижнем регистре.

Чтобы использовать прописные буквы (AZ) вместо строчных, вы можете заменить CHAR(RAND()*26+97)на CHAR(RAND()*26+65). Потому что ASCII-код AZ составляет 65-90, а ASCII-код AZ составляет 97-122.

Для того, чтобы просто по формуле, вы можете использовать RANDBETWEEN()из пакета анализа для замены RAND()*xx+yy.


продвинутый

Предположим, вы хотите сгенерировать строку произвольной длины (1-8 символов) из определенных символов.

Вы можете ввести нужные символы в ячейку A1 , например:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Потом,

=LEFT( MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) & 
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) &
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) &
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1),
       RAND()*8+1)

Каждый MID(...)получает 1 случайный символ от А1.


4

Хм. С VBA было бы довольно легко создать функцию для этого. С формулами это немного сложнее.

  • =CHAR(RANDBETWEEN(97,122))очевидно, дает вам одно письмо. Поэтому поместите десять из них в столбце А.
  • Затем в следующем столбце поместите =A1в ячейку B1.
  • Положите =B1&A2в B2 и заполните B2: B10. (CONCATENATE не принимает диапазоны, досадно.)
  • В ячейку С2, поставить =OFFSET(B1,RANDBETWEEN(0,9),0).

Там может быть более простой способ, с формулами массива или что-то.


1
+1 - я знал, что должен быть способ - однако, я бы предпочел использовать INDEX вместо OFFSET - какINDEX(B1:B10,RANDBETWEEN(1,10))
Jook

2

В качестве формулы для одного символа вы можете использовать это

=CHAR(RANDBETWEEN(97,122))

Просто посмотрите в любой ACSII-таблице, чтобы выбрать желаемый диапазон рандов.

Но случайная длина хитрая, не из-за случайной длины, а из-за случайных символов, которые вы хотите собрать вместе. В противном случае вы можете просто использовать функцию REPT, объединенную с функцией RAND и приведенной выше формулой.

Но чтобы соответствовать вашему описанному результату, я бы использовал этот код:

'Put this into a VBA-Module, to be accessable as a worksheet function
Public Function RandomString() As String
  Dim i As Long
  Dim lngEnd As Long
  Dim strResult As String

  With Application.WorksheetFunction

    lngEnd = .RandBetween(1, 20) 'String length 1-20 characters
    strResult = ""

    'create a random string of a random length between 1 and 20
    For i = 1 To lngEnd
      strResult = strResult & Chr(.RandBetween(97, 122))
    Next i

  End With
  Debug.Print strResult
  RandomString = strResult 'return the random string
End Function

Если есть решение сделать этот код с формулами, то есть без VBA, я бы очень хотел узнать об этом :)


1

=LEFT(CHAR(RANDBETWEEN(97,122))&CHAR(RANDBETWEEN(97,122))&... repeat as many times as needed, RANDBETWEEN(minimum length, maximum length))


Немного больше контекста о том, как это работает, действительно улучшит ответ.
Бурги

1

Эта формула не требует ячейки с "abc ... ABC ... 012"

Случайный 1 символ из [a-zA-Z0-9].

=CHAR(CHOOSE(RANDBETWEEN(1,3),RANDBETWEEN(48,57),RANDBETWEEN(65,90),RANDBETWEEN(97,122)))

Если нужно больше символов, скопируйте CHAR (...) и разделите их символом &.

Это решение от Oaktree http://www.mrexcel.com/forum/excel-questions/332116-generate-random-alphanumeric-code.html


0

(Если вам нужны только буквы, смотрите добавленный абзац ниже)

Создайте случайную строку из заглавных букв и цифр случайной длины от 8 до 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Объяснение:

  1. сгенерировать случайную строку из цифр и прописных букв, длины Minimun 12: BASE(RAND()*10^18,36,12). Хитрость заключается в генерации большого случайного числа, а затем преобразовании его в базу 36 с получением чего-то, что эффективно выглядит как строка.
  2. генерировать случайное число от 8 до 12, длина строки RAND()*4+8
  3. Возьмите символы строки как в (1) от 1 до длины, которую вы сгенерировали в (2).

Функции, используемые в формуле (наизнанку):

  • RAND() Возвращает случайное число от 0 до 1.
  • BASE(Number; Radix; [MinimumLength]) Преобразует положительное целое число в указанную базу в текст из системы нумерации. Используются цифры 0-9 и буквы AZ.
  • MID("Text"; Start; Number) Возвращает текстовую строку текста. Параметры указывают начальную позицию и количество символов.

Число 10^18- это магическое число, для которого сгенерированная строка не имеет конечных или ведущих нулей. Если вам нужно создать более длинную строку, я бы предложил создать две или более таких строк и объединить их.

Заметьте: это решение было протестировано на LibreOffice Calc 5, но оно должно работать и в Microsoft Excel, поскольку функции такие же, как в их документации (на которую я не могу связать, потому что у меня недостаточно репутации).

Отредактированный ответ

Поскольку в комментарии было указано, что ФП специально запрашивал только буквы, я добавлю эту альтернативную версию в: =MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(BASE(RAND()*10^22,36,16),"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),1,RAND()*4+8)

где вы заменяете все вхождения цифр на пустые строки. Таким образом, вы получаете только (заглавные) буквы. Я подправил магические числа для подсчета вероятности того, что начальная случайная строка имеет много цифр. Это не отказоустойчиво, хотя в принципе вы можете получить строки, которые короче, чем ожидалось.

Если вам нужно быть уверенным в минимальной длине, у вас есть другая (еще более сложная) альтернатива: =MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(BASE(RAND()*10^22,36,16),"0",CHAR(RANDBETWEEN(65,90))),"1",CHAR(RANDBETWEEN(65,90))),"2",CHAR(RANDBETWEEN(65,90))),"3",CHAR(RANDBETWEEN(65,90))),"4",CHAR(RANDBETWEEN(65,90))),"5",CHAR(RANDBETWEEN(65,90))),"6",CHAR(RANDBETWEEN(65,90))),"7",CHAR(RANDBETWEEN(65,90))),"8",CHAR(RANDBETWEEN(65,90))),"9",CHAR(RANDBETWEEN(65,90))),1,RAND()*4+8)

где вы заменяете каждую цифру случайно сгенерированной заглавной буквой.

Я должен сказать, что мне понравилось первоначальное решение по сравнению с теми, которые приведены в других ответах, это то, что оно является кратким и относительно простым для понимания. Две альтернативы теряют эти свойства.


ОП специально просил только буквы алфавита. Можете ли вы отредактировать свой ответ, чтобы решить эту проблему?
music2myear

@ music2myear готово, но при этом вы теряете лаконичность оригинальной версии.
Кристиан

Краткость полезна, только если она отвечает потребностям. Этот ответ, даже если он длиннее, лучше, потому что он фактически отвечает на конкретный вопрос, заданный ОП.
music2myear

0

Для генерации случайных символов:

В ячейке B1

= CHAR (RANDBETWEEN (48,131)) (или любой другой набор символов, который вы хотите)

Заполните это до количества столбцов = максимально необходимые символы в вашей строке

Для генерации случайной длины

В ячейке А1

= ЛЕВЫЙ (СЦЕПИТЬ (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), СЛУЧМЕЖДУ (0,9))

Для генерации случайных строк

Заполните всю таблицу вниз в столбце A1

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.