Come creare una stringa casuale di lunghezza casuale dall'alfabeto?


Risposte:


14

Di base

Supponiamo di voler generare una stringa di lunghezza casuale (1-8 caratteri) da alfabeti minuscoli (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)

Ciascuno CHAR(...)genera 1 alfabeto casuale minuscolo.

Per utilizzare alfabeti maiuscoli (AZ) anziché minuscoli, è possibile sostituire CHAR(RAND()*26+97)con CHAR(RAND()*26+65). Poiché il codice ASCII di AZ è 65-90 e il codice ASCII di az è 97-122.

Per semplicemente la formula, è possibile utilizzare RANDBETWEEN()degli strumenti di analisi per sostituire RAND()*xx+yy.


Avanzate

Supponiamo di voler generare una stringa di lunghezza casuale (1-8 caratteri) da caratteri specifici.

È possibile inserire i caratteri desiderati nella cella A1 , ad esempio:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Poi,

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

Ognuno MID(...)prende 1 carattere casuale da A1.


4

Hmm. Sarebbe abbastanza facile con VBA creare una funzione per farlo. Con le formule è un po 'più coinvolto.

  • =CHAR(RANDBETWEEN(97,122))ovviamente ti dà una lettera. Quindi metti dieci di quelli nella colonna A.
  • Quindi nella colonna successiva, inserisci la =A1cella B1.
  • Inserisci =B1&A2B2 e compila B2: B10. (CONCATENATE non accetta i range, in modo fastidioso.)
  • Nella cella C2, metti =OFFSET(B1,RANDBETWEEN(0,9),0).

Potrebbe esserci un modo più semplice, con formule di array o qualcosa del genere.


1
+1 - Sapevo che ci sarebbe stato un modo - tuttavia, avrei preferito usare INDEX invece di OFFSET - comeINDEX(B1:B10,RANDBETWEEN(1,10))
Jook

2

Come formula per un singolo personaggio potresti usarlo

=CHAR(RANDBETWEEN(97,122))

Basta guardare in qualsiasi tabella ACSII per selezionare l'intervallo rand desiderato.

Ma la lunghezza casuale è difficile, non a causa della lunghezza casuale, ma a causa dei personaggi casuali che vuoi mettere insieme. Altrimenti, potresti solo la funzione REPT unita alla funzione RAND e alla formula sopra.

Ma per adattare il risultato descritto, utilizzerei questo codice:

'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

Se esiste una soluzione per eseguire questo codice con le formule, quindi senza VBA, mi piacerebbe molto saperlo :)


1

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


Un po 'più di contesto su come funziona davvero migliorerebbe la risposta.
Burgi,


0

(Se vuoi stringhe di sole lettere vedi il paragrafo aggiunto sotto)

Genera una stringa casuale di lettere maiuscole e cifre di lunghezza casuale compresa tra 8 e 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Spiegazione:

  1. generare una stringa casuale di numeri e lettere maiuscole, di lunghezza minima 12: BASE(RAND()*10^18,36,12). Il trucco sta generando un grande numero casuale e poi convertendolo in base 36 ottenendo qualcosa che effettivamente assomiglia a una stringa.
  2. genera un numero casuale compreso tra 8 e 12, la lunghezza della stringa RAND()*4+8
  3. prendi i caratteri della stringa come in (1) da 1 alla lunghezza che hai generato in (2).

Funzioni utilizzate nella formula (al rovescio):

  • RAND() Restituisce un numero casuale compreso tra 0 e 1.
  • BASE(Number; Radix; [MinimumLength]) Converte un numero intero positivo in una base specificata in un testo dal sistema di numerazione. Vengono utilizzate le cifre 0-9 e le lettere AZ.
  • MID("Text"; Start; Number) Restituisce una stringa di testo di un testo. I parametri specificano la posizione iniziale e il numero di caratteri.

Il numero 10^18è un numero magico per il quale la stringa generata non ha zero finali o iniziali. Se è necessario creare una stringa più lunga, suggerirei di creare due o più stringhe e concatenarle.

Nota: questa soluzione è stata testata su LibreOffice Calc 5, ma dovrebbe funzionare anche in Microsoft Excel poiché le funzioni sono le stesse della loro documentazione (che non posso collegare perché non ho abbastanza reputazione).

Risposta modificata

Dal momento che è stato sottolineato in un commento che l'OP ha specificamente richiesto solo lettere, inserirò questa versione alternativa in: =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)

dove sostituisci tutte le occorrenze di cifre in stringhe vuote. In questo modo si ottengono solo lettere (maiuscole). Ho modificato i numeri magici per contare la possibilità che la stringa casuale iniziale abbia molte cifre. Non è sicuro, anche se in linea di principio è possibile ottenere stringhe più brevi del previsto.

Se devi essere sicuro della lunghezza minima, hai questa altra alternativa (ancora più complicata): =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)

dove sostituisci ogni cifra con una lettera maiuscola generata casualmente.

Devo dire che ciò che mi è piaciuto della soluzione iniziale rispetto a quelle fornite nelle altre risposte è che è conciso e relativamente semplice da capire. Le due alternative perdono queste proprietà.


OP chiedeva specificamente solo caratteri alfabetici. Puoi modificare la tua risposta per risolvere questo problema?
music2myear

@ music2myear fatto, ma in questo modo perdi la concisione della versione originale.
CristianCantoro,

La concisione è utile solo se soddisfa i bisogni. Questa risposta, anche se è più lunga, è migliore perché risponde effettivamente alla domanda specifica posta dall'OP.
music2myear

0

Per generare caratteri casuali:

Nella cella B1

= CHAR (RANDBETWEEN (48.131)) (o qualunque set di caratteri desiderato)

Riempilo con il numero di colonne = numero massimo di caratteri richiesti nella stringa

Per generare una lunghezza casuale

Nella cella A1

= SINISTRA (CONCATENA (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), RANDBETWEEN (0,9))

Per generare stringhe casuali

Riempi l'intera tabella verso il basso nella colonna A1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.