Як створити з алфавіту випадковий рядок випадкової довжини?


Відповіді:


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 випадковий символ від A1.


4

Хм. З VBA було б досить легко зробити функцію, щоб це зробити. З формулами це трохи більше пов'язане.

  • =CHAR(RANDBETWEEN(97,122))очевидно дає вам один лист. Тож покладіть десять із них у стовпчик А.
  • Потім у наступному стовпчику покладіть =A1у комірку B1.
  • Помістіть =B1&A2B2 і заповніть 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)

де ви замінюєте кожну цифру випадково сформованою великою літерою.

Я мушу сказати, що те, що мені сподобалося в початковому рішенні стосовно тих, що наведені в інших відповідях, - це те, що це стисло і порівняно просто. Дві альтернативи втрачають ці властивості.


OP спеціально просив лише символів алфавіту. Чи можете ви відредагувати свою відповідь, щоб вирішити це?
music2myear

@ music2myear зроблено, але таким чином ви втрачаєте стислість оригінальної версії.
CristianCantoro

Лаконічність корисна лише тоді, коли вона відповідає потребам. Ця відповідь, хоч і довша, краща, оскільки вона фактично відповідає на конкретне запитання, яке задає ОП.
music2myear

0

Для генерації випадкових символів:

У комірці B1

= CHAR (RANDBETWEEN (48,131)) (або будь-який інший набір символів)

Заповніть це на кількість стовпців = максимально необхідні символи у рядку

Для генерації випадкової довжини

У комірці А1

= ЛІВО (КОНЦАТЕНТ (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), РЯДНИК (0,9))

Для генерації випадкових рядків

Заповніть всю таблицю в стовпчик А1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.