vb6 - studio - val visual basic
Vb6 ¿Cómo puedo hacer una secuencia aleatoria de 0-9 y az de x caracteres (8)
¿Intenta crear una cadena aleatoria, x caracteres de longitud usando 0-9 y az / AZ y parece que no puede encontrar un buen ejemplo, ninguna idea?
Olvidé todo mi VB6 (gracias a Dios) pero en pseudocódigo es bastante fácil:
all_chars = an array of all the valid chars seed random number generator for i = 1 to x do random_index = get a random number between 1 and length of all_chars ''I remember how to concat and comment in VB6 :-) string = string & all_chars[random_index] end for done!
De modo que solo se trata de descubrir cómo crear una matriz y rellenarla con caracteres, cómo obtener la longitud de la matriz y cómo obtener un número aleatorio entre el primero y el último índice de dicha matriz.
Bueno, todo eso y bucle, por supuesto.
Use aleatorizar
Int (Rnd * (límite bajo)) + (límite alto) generará un número aleatorio
Genere una matriz con valores de asc ("a") a asc ("z") y de asc ("0") a asc ("9")
Genere un número aleatorio entre 1 y 26 (10 + 26) y búsquelo en el conjunto.
Ya no tienes VB6 instalado.
Usando el algoritmo de Vinko Vrsalovic, aquí está el código de funcionay, gracias y cya!
all_chars = array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","S","T","U","V","W","X","Y","Z")
Randomize
for i = 1 to 4
random_index = int(Rnd()*25)
clave = clave & all_chars(random_index)
next
El método de Joel está bien (excepto para la variable de ciclo entero, y usando "+" para la concatenación). (-:
Sin embargo, el resultado se puede hacer más interesante de varias maneras.
En primer lugar, puede generar cadenas que tengan la misma distribución de frecuencia aproximada que el texto en inglés común, al crear una cadena inicial con muchos más caracteres Ee y Tt que caracteres Zz. Una cadena de quizás 1000 caracteres (el doble que si se combinara el caso) en esta mezcla aproximada funcionaría bien.
Agregue el mismo número de 0,9 caracteres en la proporción que le gustaría ver en la salida final. También puedes mezclar esta secuencia de ver para que se vea más aleatoria, pero realmente no importa.
Luego usa un selector aleatorio en el rango de 1..Len (Secuencia de semillas) para elegir cada personaje, como en el ejemplo de Joel.
¿Por qué hacer esto? No hay una buena razón, excepto que los resultados serán más familiares.
Una segunda opción es generar dos de tales cadenas de semillas, una de las consonantes en el peso del cuerpo, y la otra con las vocales en la misma ponderación (más E que O que U, etc.). Usaría solo un caso, no mixto.
Luego alterna dos selecciones aleatorias, primero de las consonantes, luego de las vocales, para generar dígrafos como TI, WO, DE, y así sucesivamente. Encadena estos para formar "palabras".
Debido a que la salida resultante es pronunciable, es mucho más fácil de recordar. Además, parece inquietantemente japonés. (-:
Nuestra biblioteca Stamina (funciones ASM para VB / VBA) tiene rutinas que hacen estas cosas, pero es bastante fácil en VB puro.
Realmente no dijiste para qué estabas usando esto. Si necesita cadenas pequeñas (<= 32,766), creo que la función de Joel funcionará bien. Sin embargo, si necesita algo para generar cadenas realmente grandes, esto podría ser útil. En mi sistema hará una cadena de 1.000.000 de caracteres en 0.33291015625 segundos (sí, lo sé ... mazo :)) También puede parametrizar el conjunto de caracteres para que no tenga que cambiar el código cada vez que quiera hacer algo "especial" ":):
Public Function RandomString( _
ByVal length As Long, _
Optional charset As String = "abcdefghijklmnopqrstuvwxyz0123456789" _
) As String
Dim chars() As Byte, value() As Byte, chrUprBnd As Long, i As Long
If length > 0& Then
Randomize
chars = charset
chrUprBnd = Len(charset) - 1&
length = (length * 2&) - 1&
ReDim value(length) As Byte
For i = 0& To length Step 2&
value(i) = chars(CLng(chrUprBnd * Rnd) * 2&)
Next
End If
RandomString = value
End Function
Function RandomString(cb As Integer) As String
Randomize
Dim rgch As String
rgch = "abcdefghijklmnopqrstuvwxyz"
rgch = rgch & UCase(rgch) & "0123456789"
Dim i As Long
For i = 1 To cb
RandomString = RandomString & Mid$(rgch, Int(Rnd() * Len(rgch) + 1), 1)
Next
End Function
Tenga en cuenta que el generador de números aleatorios incorporado no es criográficamente seguro, por lo que una función como esta no debe utilizarse para generar contraseñas.
Si está utilizando una base de datos SQL, puede generar una clave principal como esta:
SELECT NEWID() as KeyValue
Es una muy buena manera y también muy segura.
Inspirado por esta pregunta, hice una pregunta similar donde propongo usar un GUID para generar la secuencia. La brevedad de esto, como señalo, es que si no hay otros defectos en mi lógica, entonces habrá una secuencia aleatoria de A a F y 10 dígitos. Si puedes vivir con el hecho de que las letras G a Z faltan, entonces esta podría ser una solución para ti.