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


Ответы:


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.