La respuesta de Dave lo reanudó bastante bien, pero para aclarar un poco más sobre la segunda opción:
Un generador de números aleatorios de hardware real utiliza una fuente de entropía física. Tal fuente de entropía podría ser radiación cósmica, ruido eléctrico, efecto avanlanche de un diodo de polarización inversa (o transistor BJT), circuito de chua, etc. Cuanto menos determinista sea la fuente de entropía, mejor será la calidad de la salida aleatoria. Una fuente de entropía ideal sería utilizar un efecto de física cuántica, o algo que no se pueda modelar con ecuaciones deterministas.
Otro factor importante con los generadores de números aleatorios es que la fuente de entropía puede generar solo una cantidad limitada de entropía por unidad de tiempo. Un buen ejemplo es el circuito de chua: si bien es bastante aleatorio, tiene una velocidad muy baja y no puede utilizarse para aplicaciones de la vida real.
En muchos procesadores / microcontroladores con RNG incorporados, se utiliza la deriva del reloj de 2 a 4 relojes que se sincronizan de manera deliberadamente incorrecta. Luego, usan filtros analógicos y digitales para aleatorizar aún más el patrón y cambiar el resultado en un registro. Realizar dicho filtrado requiere unos pocos ciclos, lo que explica la cantidad mínima de ciclos requerida en un reloj dado antes de que esté disponible el valor más nuevo.
La deriva del reloj no es un efecto cuántico, por lo que podría modelarse, pero es lo suficientemente aleatorio, ya que depende de muchos parámetros, como la temperatura, el proceso de silicio, la frecuencia de operación, el ruido eléctrico, las radiaciones de fondo, etc. .
En aplicaciones donde el RNG de hardware no tiene un rendimiento suficiente (como en aplicaciones criptográficas muy exigentes), es bastante común usar el RNG de hardware como semilla para un generador de números pseudoaleatorios como la función rand () en el sdtlib. Sin embargo, dicha aplicación generalmente proporciona una mejor implementación de rand (), que está específicamente diseñado para ejecutarse desde una semilla que puede descartarse muy a menudo con valores aleatorios verdaderos . En el procesador Intel más nuevo con RNG de hardware integrado, la parte del algoritmo pseudoaleatorio está directamente integrada en el silicio, por lo que es realizada por hardware, produciendo un rendimiento aleatorio muy alto.
Si le importa el método rand () en sí mismo, es solo una expresión matemática diseñada para generar una cantidad de entropía lo suficientemente grande. Lo suficientemente grande como para depender de la aplicación: para generaciones de claves criptográficas, se requiere que la aleatoriedad sea de mayor calidad que la aleatoriedad requerida para un aleatorio aleatorio simple en su reproductor de música favorito. Es obvio que cuanto mayor sea la calidad de la salida aleatoria, mayor será el costo computacional del número aleatorio.
Las operaciones involucradas en un número aleatorio son bastante similares a las involucradas en el cálculo del hash MD5 de un archivo: intentan usar una especie de efecto de avalancha de bits para que un solo cambio de bit en un valor semilla cambie todo el patrón generador. Como nota al margen, NO recomiendo usar MD5 como generador de números pseudoaleatorios; fue solo un ejemplo. Sería ineficiente y no tan aleatorio, pero el punto está ahí: si alimenta el mismo archivo a un algoritmo de hasing MD5, siempre obtendrá el mismo resultado determinista, casi de la misma manera que siempre obtendría el mismo resultado de la función rand () si ingresa la misma semilla a menos que su implementación dependa de algunos elementos arbitrarios como la hora actual.