¿Cómo crear una cadena aleatoria de longitud aleatoria del alfabeto?

11

Quiero crear una cadena aleatoria con una longitud aleatoria del alfabeto en Excel. Por ejemplo, "jlskdjf", "kjlk", "kljsodif", etc. ¿Cómo puedo hacer eso?

Jenny Hoang
fuente

Respuestas:

14

Básico

Suponga que desea generar una cadena de longitud aleatoria (1-8 caracteres) a partir de alfabetos en minúsculas (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)

Cada uno CHAR(...)genera 1 alfabeto aleatorio en minúsculas.

Para usar alfabetos en mayúscula (AZ) en lugar de minúsculas, puede reemplazar CHAR(RAND()*26+97)con CHAR(RAND()*26+65). Porque el código ASCII de AZ es 65-90, y el código ASCII de az es 97-122.

Simplemente la fórmula, se puede usar RANDBETWEEN()de herramientas para análisis de reemplazar RAND()*xx+yy.


Avanzado

Suponga que desea generar una cadena de longitud aleatoria (1-8 caracteres) a partir de caracteres específicos.

Puede ingresar los caracteres deseados en la celda A1 , por ejemplo:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Entonces,

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

Cada uno MID(...)obtiene 1 personaje aleatorio de A1.

wilson
fuente
4

Hmm Sería bastante fácil con VBA hacer una función para hacerlo. Con las fórmulas es un poco más complicado.

  • =CHAR(RANDBETWEEN(97,122))obviamente te da una carta. Así que pon diez de esos en la columna A.
  • Luego, en la siguiente columna, ingrese la =A1celda B1.
  • Ponga =B1&A2B2 y complete B2: B10. (CONCATENAR no acepta rangos, molestamente).
  • En la celda C2, poner =OFFSET(B1,RANDBETWEEN(0,9),0).

Puede haber una manera más fácil, con fórmulas de matriz o algo así.

Benshepherd
fuente
1
+1 - Sabía que debería haber una manera, sin embargo, preferiría usar INDEX en lugar de OFFSET, comoINDEX(B1:B10,RANDBETWEEN(1,10))
Jook
2

Como fórmula para un solo personaje, puedes usar esto

=CHAR(RANDBETWEEN(97,122))

Simplemente busque en cualquier tabla ACSII para seleccionar el rango de rand deseado.

Pero la longitud aleatoria es complicada, no por la longitud aleatoria, sino por los caracteres aleatorios que desea unir. De lo contrario, podría simplemente combinar la función REPT con la función RAND y la fórmula anterior.

Pero para ajustarse al resultado descrito, usaría este código:

'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

Si hay una solución para hacer este código con fórmulas, por lo tanto, sin VBA, me gustaría saberlo :)

Jook
fuente
1

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

Mike Fitzpatrick
fuente
Un poco más de contexto sobre cómo funciona esto realmente mejoraría la respuesta.
Burgi
0

(Si desea cadenas de solo letras, vea el párrafo agregado a continuación)

Genere una cadena aleatoria de letras mayúsculas y dígitos de longitud aleatoria entre 8 y 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Explicación:

  1. generar una cadena aleatoria de dígitos y letras mayúsculas, de una longitud mínima de 12: BASE(RAND()*10^18,36,12). El truco es generar un gran número aleatorio y luego convertirlo a la base 36 obteniendo algo que efectivamente se parece a una cadena.
  2. generar un número aleatorio entre 8 y 12, la longitud de la cadena RAND()*4+8
  3. tome los caracteres de la cadena como en (1) de 1 a la longitud que generó en (2).

Funciones utilizadas en la fórmula (de adentro hacia afuera):

  • RAND() Devuelve un número aleatorio entre 0 y 1.
  • BASE(Number; Radix; [MinimumLength]) Convierte un entero positivo en una base especificada en un texto del sistema de numeración. Se utilizan los dígitos 0-9 y las letras AZ.
  • MID("Text"; Start; Number) Devuelve una cadena de texto de un texto. Los parámetros especifican la posición inicial y el número de caracteres.

El número 10^18es un número mágico para el que la cadena generada no tiene ceros iniciales o iniciales. Si necesita crear una cadena más larga, sugeriría crear dos o más cadenas y concatenarlas.

Nota: esta solución se probó en LibreOffice Calc 5, pero debería funcionar también en Microsoft Excel ya que las funciones son las mismas que en su documentación (que no puedo vincular porque no tengo suficiente reputación).

Respuesta editada

Como se señaló en un comentario que el OP solicitó específicamente solo cartas, lanzaré esta versión alternativa en: =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)

donde sustituye todas las apariciones de dígitos a cadenas vacías. De esta forma solo obtienes letras (mayúsculas). He ajustado los números mágicos para contar la posibilidad de que la cadena aleatoria inicial tenga muchos dígitos. No es a prueba de fallas, aunque en el sentido de que, en principio, podría obtener cadenas que son más cortas de lo esperado.

Si necesita estar seguro de la longitud mínima, entonces tiene esta otra alternativa (aún más complicada): =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)

donde sustituye cada dígito con una letra mayúscula generada aleatoriamente.

Debo decir que lo que me gustó de la solución inicial con respecto a las proporcionadas en las otras respuestas es que es conciso y relativamente sencillo de entender. Las dos alternativas pierden estas propiedades.

CristianCantoro
fuente
OP estaba pidiendo específicamente solo caracteres del alfabeto. ¿Puedes editar tu respuesta para abordar esto?
music2myear
@ music2myear hecho, pero de esta manera pierdes la concisión de la versión original.
CristianCantoro
La concisión solo es útil si satisface las necesidades. Esta respuesta, aunque es más larga, es mejor porque en realidad responde la pregunta específica que OP hizo.
music2myear
0

Para generar caracteres aleatorios:

En la celda B1

= CHAR (RANDBETWEEN (48,131)) (o cualquier conjunto de caracteres que desee)

Complete esto con el número de columnas = caracteres máximos requeridos en su cadena

Para generar longitud aleatoria

En la celda A1

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

Para generar cadenas aleatorias

Rellene toda la tabla en la columna A1

JamieG
fuente