Jak utworzyć losowy ciąg o losowej długości z alfabetu?

11

Chcę utworzyć losowy ciąg o losowej długości z alfabetu w Excelu. Na przykład „jlskdjf”, „kjlk”, „kljsodif” itp. Jak to zrobić?

Jenny Hoang
źródło

Odpowiedzi:

14

Podstawowy

Załóżmy, że chcesz wygenerować ciąg o losowej długości (1-8 znaków) z małych liter (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)

Każdy CHAR(...)generuje 1 losowy alfabet.

Aby korzystać z górnych alfabetów przypadku (AZ) zamiast małych liter, można zastąpić CHAR(RAND()*26+97)z CHAR(RAND()*26+65). Ponieważ kod ASCII dla AZ to 65-90, a kod ASCII dla az to 97-122.

Po prostu wzoru, można skorzystać RANDBETWEEN()z Analysis ToolPak zastąpić RAND()*xx+yy.


zaawansowane

Załóżmy, że chcesz wygenerować ciąg losowy (1-8 znaków) z określonych znaków.

Możesz wprowadzić żądane znaki w komórce A1 , na przykład:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Następnie,

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

Każdy MID(...)otrzymuje 1 losową postać z A1.

wilson
źródło
4

Hmm Z VBA byłoby łatwo stworzyć funkcję, która by to zrobiła. W przypadku formuł jest to nieco bardziej zaangażowane.

  • =CHAR(RANDBETWEEN(97,122))oczywiście daje jedną literę. Więc umieść dziesięć z nich w kolumnie A.
  • Następnie w następnej kolumnie wstaw =A1komórkę B1.
  • Wprowadź =B1&A2B2 i wypełnij B2: B10. (CONCATENATE nie akceptuje zakresów, irytujące).
  • W komórce C2 wstaw =OFFSET(B1,RANDBETWEEN(0,9),0).

Może być łatwiejszy sposób, używając formuł tablicowych lub czegoś takiego.

benshepherd
źródło
1
+1 - Wiedziałem, że powinien istnieć sposób - jednak wolę używać INDEKSU zamiast OFFSET - jakINDEX(B1:B10,RANDBETWEEN(1,10))
Jook
2

Jako wzór na pojedynczy znak możesz tego użyć

=CHAR(RANDBETWEEN(97,122))

Wystarczy zajrzeć do dowolnej tabeli ACSII, aby wybrać żądany zakres rand.

Ale losowa długość jest trudna, nie ze względu na losową długość, ale ze względu na losowe postacie, które chcesz połączyć. W przeciwnym razie możesz po prostu funkcję REPT połączoną z funkcją RAND i powyższą formułą.

Ale aby dopasować się do opisanego wyniku, użyłbym tego kodu:

'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

Jeśli istnieje rozwiązanie do zrobienia tego kodu z formułami, a więc bez VBA, bardzo chciałbym o tym wiedzieć :)

Jook
źródło
1

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

Mike Fitzpatrick
źródło
Nieco większy kontekst, w jaki sposób to działa, naprawdę poprawiłoby odpowiedź.
Burgi,
0

(Jeśli chcesz ciągów zawierających tylko litery, zobacz dodany akapit poniżej)

Wygeneruj losowy ciąg wielkich liter i cyfr o losowej długości od 8 do 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Wyjaśnienie:

  1. wygenerować losowy ciąg cyfr i wielkich liter, długości minimun 12: BASE(RAND()*10^18,36,12). Sztuczka polega na wygenerowaniu dużej liczby losowej, a następnie przekształceniu jej w bazę 36, uzyskując coś, co faktycznie wygląda jak łańcuch.
  2. wygeneruj liczbę losową od 8 do 12, długość ciągu RAND()*4+8
  3. weź znaki ciągu jak w (1) od 1 do długości wygenerowanej w (2).

Funkcje użyte w formule (na lewą stronę):

  • RAND() Zwraca liczbę losową z przedziału od 0 do 1.
  • BASE(Number; Radix; [MinimumLength]) Konwertuje dodatnią liczbę całkowitą na określoną bazę na tekst z systemu numeracji. Używane są cyfry 0–9 i litery AZ.
  • MID("Text"; Start; Number) Zwraca ciąg tekstowy tekstu. Parametry określają pozycję początkową i liczbę znaków.

Liczba 10^18jest liczbą magiczną, dla której generowany ciąg nie ma zer ani wiodących zer. Jeśli chcesz utworzyć dłuższy ciąg, sugerowałbym utworzenie dwóch lub więcej takich ciągów i połączenie ich.

Uwaga: to rozwiązanie zostało przetestowane na LibreOffice Calc 5, ale powinno działać również w Microsoft Excel, ponieważ funkcje są takie same jak w ich dokumentacji (których nie mogę połączyć, ponieważ nie mam wystarczającej reputacji).

Edytowana odpowiedź

Ponieważ w komentarzu wskazano, że OP konkretnie poprosił tylko o litery, wrzucę tę alternatywną wersję do: =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)

gdzie podstawisz wszystkie wystąpienia cyfr na puste ciągi. W ten sposób otrzymujesz tylko (wielkie) litery. Poprawiłem magiczne liczby, aby liczyć na to, że początkowy losowy ciąg ma wiele cyfr. Nie jest bezpieczny, ale w tym sensie, że w zasadzie można uzyskać ciągi krótsze niż oczekiwano.

Jeśli chcesz mieć pewność co do minimalnej długości, masz inną (jeszcze bardziej skomplikowaną) alternatywę: =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)

gdzie podstawiasz każdą cyfrę losowo generowaną wielką literą.

Muszę powiedzieć, że to, co mi się podobało z pierwotnego rozwiązania w stosunku do tych podanych w innych odpowiedziach, to zwięzłe i stosunkowo proste do zrozumienia. Dwie alternatywy tracą te właściwości.

CristianCantoro
źródło
OP konkretnie prosił tylko o znaki alfabetu. Czy możesz edytować swoją odpowiedź, aby rozwiązać ten problem?
music2myear
@ music2myear gotowe, ale w ten sposób tracisz zwięzłość oryginalnej wersji.
CristianCantoro
Zwięzłość jest przydatna tylko wtedy, gdy spełnia potrzeby. Ta odpowiedź, mimo że jest dłuższa, jest lepsza, ponieważ faktycznie odpowiada na zadane pytanie OP.
music2myear
0

Aby wygenerować losowe znaki:

W komórce B1

= CHAR (RANDBETWEEN (48,131)) (lub dowolny inny zestaw znaków, jaki chcesz)

Wypełnij to liczbą kolumn = maksymalna wymagana liczba znaków w ciągu

Aby wygenerować losową długość

W komórce A1

= LEWY (POŁĄCZENIE (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), RANDBETWEEN (0,9))

Aby wygenerować losowe ciągi

Wypełnij całą tabelę w dół w kolumnie A1

JamieG
źródło