Visual Basic - Random se me repite cada cierto tiempo, como evita

Life is soft - evento anual de software empresarial
 
Vista:

Random se me repite cada cierto tiempo, como evita

Publicado por (A)mén! (2 intervenciones) el 30/11/2004 18:21:15
Vereis, estoy haciendo un programita que trabaja con claves para encriptar cosas, el problema me viene cuando quiero generar claves en código ASCII usando la instrucción randomize.
Para crear por ejemplo un archivo llamado "clave.txt" con un contenido de 1000 carácteres aleatorios, yo haría esto:
-----------------------------
Open "key.txt" For Output As #1
For i = 1 To 1000
Randomize
Print #1, Chr(32 + CInt(Rnd * 223));
Next
Close #1
----------------------
Ahora bien, tras hacerlo, en el archivo, si lo abrimos con el bloc de notas veremos a simple vista muchos carácteres raros y aleatorios, a simple vista ha salido bien. Pero no contento con esto, decido seleccionar un trozo con el ratón de los primeros carácteres de la lista (unos 20) y buscar esa cadena en el resto del archivo. Con lo que me doy cuenta, que todo habia salido bien a simple vista, porque a la practica me doy cuenta que los 1000 caracteres son una repetición continúa de 128 carácteres aleatorios, es decir 1000/128 veces esa cadena aleatoria de carácteres. Probádlo vosotros.
Según he leido, cuando invocas a randomize, este toma como valor el segundo del reloj para iniciar una secuencia "aleatoria" y supongo que esto sucede tan rapido, que solo será capaz de realizar una secuencia de 128 carácteres y repetirla continuamente. Supongo que alguna solución debe haber pasando algun argumento a randomize... ¡péeeeeero! no la conozco... ¿me ayudais?

PD: Como veis no soy el típico que viene aquí a que le "programen sus programas", simplemente he buscado y buscado y no encuentro... :-)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Random se me repite cada cierto tiempo, como ev

Publicado por bla (230 intervenciones) el 30/11/2004 21:33:52
El problema es que has metido el Randomize dentro del bucle. Ten en cuenta que si dos ejecuciones de Randomize se producen dentro del mismo milisegundo entonces establecen la misma semilla y el rnd siguiente nos dará el mismo número las dos veces.
Además cada rnd establece una nueva semilla a partir del número generado, por lo que únicamente es necesario llamar a Randomize una sóla vez en todo un programa.
El programa quedaría así:
Open "key.txt" For Output As #1
Randomize
For i = 1 To 1000
Print #1, Chr(32 + CInt(Rnd * 223));
Next
Close #1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Random se me repite cada cierto tiempo, como ev

Publicado por bla (230 intervenciones) el 30/11/2004 21:43:10
En lugar de 32+CInt(Rnd*223) utiliza 32+Int(Rnd*224). Observa el Int y el 224.
Si utilizas CInt estás redondeando, con lo cual el 32 y el 255 tendrán la mitad de probabilidades de aparecer que el resto de números.

Por cierto, no sé para qué utilizas el fichero, pero es perfectamente posible escribir caracteres con ascii<32
Randomize
Open \"key.txt\" For bynary As #1
For i = 1 To 1000
put #1, , cbyt(Int(Rnd * 256));
Next
Close #1
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar