Comment créer une chaîne aléatoire de longueur aléatoire à partir de l'alphabet?


11

Je veux créer une chaîne aléatoire avec une longueur aléatoire à partir de l'alphabet dans Excel. Par exemple, "jlskdjf", "kjlk", "kljsodif", etc. Comment puis-je faire cela?

Réponses:


14

De base

Supposons que vous souhaitez générer une chaîne de longueur aléatoire (1 à 8 caractères) à partir d'alphabets en minuscules (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)

Chacun CHAR(...)génère 1 alphabet minuscule aléatoire.

Pour utiliser des alphabets majuscules (AZ) au lieu de minuscules, vous pouvez remplacer CHAR(RAND()*26+97)par CHAR(RAND()*26+65). Parce que le code ASCII de AZ est 65-90 et le code ASCII de az est 97-122.

Pour simplement la formule, vous pouvez utiliser RANDBETWEEN()d' utilitaire d' analyse pour remplacer RAND()*xx+yy.


Avancée

Supposons que vous souhaitiez générer une chaîne de longueur aléatoire (1 à 8 caractères) à partir de caractères spécifiques.

Vous pouvez saisir les caractères souhaités dans la cellule A1 , par exemple:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Ensuite,

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

Chacun MID(...)obtient 1 caractère aléatoire de A1.


4

Hmm. Il serait assez facile avec VBA de créer une fonction pour le faire. Avec les formules, c'est un peu plus compliqué.

  • =CHAR(RANDBETWEEN(97,122))vous donne évidemment une lettre. Alors mettez-en dix dans la colonne A.
  • Ensuite, dans la colonne suivante, insérez la =A1cellule B1.
  • Mettez =B1&A2B2 et remplissez B2: B10. (CONCATENATE n'accepte pas les plages, de manière ennuyeuse.)
  • Dans la cellule C2, mettez =OFFSET(B1,RANDBETWEEN(0,9),0).

Il pourrait y avoir un moyen plus simple, avec des formules matricielles ou quelque chose.


1
+1 - Je savais qu'il devrait y avoir un moyen - cependant, je préfère utiliser INDEX au lieu de OFFSET - commeINDEX(B1:B10,RANDBETWEEN(1,10))
Jook

2

Comme formule pour un seul caractère, vous pouvez utiliser ceci

=CHAR(RANDBETWEEN(97,122))

Il suffit de regarder dans n'importe quel tableau ACSII pour sélectionner la gamme de rand souhaitée.

Mais la longueur aléatoire est délicate, non pas à cause de la longueur aléatoire, mais à cause des caractères aléatoires que vous souhaitez assembler. Sinon, vous pourriez simplement la fonction REPT jointe à la fonction RAND et la formule ci-dessus.

Mais pour adapter le résultat décrit, j'utiliserais ce code:

'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

S'il y a une solution pour faire ce code avec des formules, donc sans VBA, j'aimerais beaucoup le savoir :)


1

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


Un peu plus de contexte sur la façon dont cela fonctionne améliorerait vraiment la réponse.
Burgi


0

(Si vous voulez des chaînes de lettres uniquement, voir le paragraphe ajouté ci-dessous)

Générez une chaîne aléatoire de lettres majuscules et de chiffres de longueur aléatoire entre 8 et 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Explication:

  1. générer une chaîne aléatoire de chiffres et de lettres majuscules, de longueur minimun 12: BASE(RAND()*10^18,36,12). L'astuce consiste à générer un grand nombre aléatoire puis à le convertir en base 36 pour obtenir quelque chose qui ressemble effectivement à une chaîne.
  2. générer un nombre aléatoire entre 8 et 12, la longueur de la chaîne RAND()*4+8
  3. prenez les caractères de la chaîne comme dans (1) de 1 à la longueur que vous avez générée dans (2).

Fonctions utilisées dans la formule (à l'envers):

  • RAND() Renvoie un nombre aléatoire compris entre 0 et 1.
  • BASE(Number; Radix; [MinimumLength]) Convertit un entier positif en une base spécifiée en un texte du système de numérotation. Les chiffres 0-9 et les lettres AZ sont utilisés.
  • MID("Text"; Start; Number) Renvoie une chaîne de texte d'un texte. Les paramètres spécifient la position de départ et le nombre de caractères.

Le nombre 10^18est un nombre magique pour lequel la chaîne générée n'a pas de zéros de fin ou de début. Si vous avez besoin de créer une chaîne plus longue, je suggère de créer deux ou plusieurs de ces chaînes et de les concaténer.

Remarque: cette solution a été testée sur LibreOffice Calc 5, mais elle devrait également fonctionner dans Microsoft Excel car les fonctions sont les mêmes que dans leur documentation (que je ne peux pas lier car je n'ai pas assez de réputation).

Réponse modifiée

Puisqu'il a été souligné dans un commentaire que le PO ne demandait spécifiquement que des lettres, je jetterai cette version alternative dans: =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)

où vous remplacez toutes les occurrences de chiffres par des chaînes vides. De cette façon, vous obtenez uniquement des lettres (majuscules). J'ai modifié les nombres magiques pour tenir compte de la possibilité que la chaîne aléatoire initiale ait plusieurs chiffres. Ce n'est pas sûr, mais dans le sens où vous pouvez en principe obtenir des chaînes plus courtes que prévu.

Si vous devez être sûr de la longueur minimale, vous avez cette autre alternative (encore plus compliquée): =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)

où vous remplacez chaque chiffre par une lettre majuscule générée aléatoirement.

Je dois dire que ce que j'ai aimé de la solution initiale par rapport à celles fournies dans les autres réponses, c'est qu'elle est concise et relativement simple à comprendre. Les deux alternatives perdent ces propriétés.


OP demandait spécifiquement des caractères alphabétiques uniquement. Pouvez-vous modifier votre réponse pour résoudre ce problème?
music2myear

@ music2myear fait, mais de cette façon, vous perdez la concision de la version originale.
CristianCantoro

La concision n'est utile que si elle répond aux besoins. Cette réponse, même si elle est plus longue, est meilleure car elle répond en fait à la question spécifique posée par OP.
music2myear

0

Pour générer des caractères aléatoires:

Dans la cellule B1

= CHAR (RANDBETWEEN (48,131)) (ou n'importe quel jeu de caractères que vous voulez)

Remplissez-le jusqu'au nombre de colonnes = caractères maximum requis dans votre chaîne

Pour générer une longueur aléatoire

Dans la cellule A1

= GAUCHE (CONCATENÉ (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), RANDBETWEEN (0,9))

Pour générer des chaînes aléatoires

Remplissez le tableau dans la colonne A1

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.