La respuesta de Dave es bastante buena para resumirla, pero para aclarar un poco más la segunda opción:
un generador de números aleatorios de hardware real utiliza una fuente de entropía física. Dicha fuente de entropía podría ser la radiación cósmica, el ruido eléctrico, el efecto de avanlanche de un diodo de polarización inversa (o transistor BJT), el 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 pueda modelarse 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: aunque es bastante aleatorio, tiene una velocidad muy pobre y no se puede usar para aplicaciones de la vida real.
En muchos procesadores / microcontroladores con RNG incorporados, se usa la desviación de reloj de 2 a 4 relojes que se sincronizan de manera incorrecta y deliberada. Luego, usan filtros tanto analógicos como digitales para aleatorizar aún más el patrón y cambiar el resultado en un registro. La realización de dicho filtrado requiere algunos ciclos, lo que explica la cantidad mínima de ciclos requeridos en un reloj determinado antes de que esté disponible el nuevo valor.
El reloj a la deriva no es un efecto cuántico, por lo que podría ser modelado, 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, el fondo. radiaciones, etc.
En aplicaciones donde el RNG de hardware no tiene un rendimiento de procesamiento suficiente (como en aplicaciones criptográficas muy exigentes), es bastante común usar el RNG de hardware como 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ñada para ejecutarse desde una semilla que puede descartarse muy a menudo con valores aleatorios true . En el procesador Intel más nuevo con RNG de hardware integrado, la parte del algoritmo seudoaleatorio se integra directamente en el silicio, por lo que se realiza mediante hardware, lo que produce un rendimiento aleatorio muy alto.
Si te importa el método rand (), es solo una expresión metemática diseñada para generar una cantidad de entropía lo suficientemente grande. Lo suficientemente grande como para ser dependiente de la aplicación: para generaciones de claves criptográficas, se requiere que la aleatoriedad sea de mayor calidad que la aleatoria requerida para una reproducción aleatoria aleatoria 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 muy similares a las que se realizan al calcular el 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 por completo la generación. modelo. Como nota al margen, NO recomiendo usar MD5 como generador de números pseudoaleatorios; Solo fue un ejemplo. Sería ineficiente y no tan aleatorio, pero el punto está ahí: si alimenta el mismo archivo a un algoritmo hasing MD5, siempre obtendrá la misma salida determinista, casi de la misma manera que siempre obtendría la misma salida 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.