En una pc normal, no se pueden generar numeros aleatorios, sino pseudo-aleatorios.
Toda la teoria se basa en tener algun tipo de funcion que devuelva algun numero basandose en register overflow o alguna cosa por el estilo, tomando como numero de partida la Semilla.
Es decir, teniendo una funcion como esta: (sacado del runtime de delphi)
proc _RandInt, range
; OUT{ <-EAX Result }
MOV EAX, [range]
IMUL EDX,[RandSeed],08088405H
INC EDX
MOV [RandSeed],EDX
MUL EDX
MOV EAX,EDX
ret
endp
la variable [RANDSEED] es una variable global. Es la semilla. Para inicializarla en Delphi se llama a Randomize y en VB tambien.
Lo que hace randomize es llamar a GetTickCount y toma eso como punto de partida.
Pero digamos, si RandSeed fuera una constante que pasa?
pues sencillo, al ser RAndSeed constante, la lista de numeros aleatorios tambien es constante. Es decir, no importa cuanta veces ejecutes el codigo, La secuencia de numeros aleatorios siempre será la misma. Esto siempre y cuando la semilla inicial sea una constante.
Bajo ese principio, antes se solia hasta "cifrar", haciendo simples XOR con una secuencia "pseudo-infinita".
así que cuando te preguntas en que pensaba el programador al generar su llave usando Rand... pues ahí lo tienes
SAludos.
agregado:
Directo de msdn
http://msdn.microsoft.com/es-es/library/8zedbtdt(v=vs.80).aspx
Para repetir secuencias de números aleatorios, llame a la función Rnd con un argumento negativo justo antes de utilizar Randomize con un argumento numérico. Si utiliza Randomize con el mismo valor que Number, no se repetirá la secuencia anterior.
Nota de seguridad
Debido a que la instrucción Random y la función Rnd comienzan con un valor de inicialización y generan números que quedan dentro de un intervalo finito, otra persona que conozca el algoritmo utilizado para generar los resultados puede predecirlos. Por tanto, la instrucción Random y la función Rnd no se deben utilizar para generar números aleatorios utilizados en criptografía.