10

Я хочу создать случайную строку со случайной длиной из алфавита в Excel. Например, "jlskdjf", "kjlk", "kljsodif" и т.д. Как я могу это сделать?

7 ответов7

13

основной

Предположим, вы хотите сгенерировать строку произвольной длины (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 случайный символ из A1.

4

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

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

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

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))

0

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

В ячейке B1

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

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

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

В ячейке А1

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

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

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

0

Эта формула не требует ячейки с "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. генерировать случайную строку из цифр и заглавных букв, минимальной длины 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)

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .