La réponse de Dave la reprend assez bien, mais pour clarifier un peu plus la deuxième option:
un véritable générateur de nombres aléatoires matériel utilise une source d'entropie physique. Une telle source d'entropie pourrait être le rayonnement cosmique, le bruit électrique, l'effet d'avanlanche d'une diode polarisée en inverse (ou transistor BJT), un circuit chua, etc. Plus la source d'entropie est moins déterministe, meilleure est la qualité de la sortie aléatoire. Une source d'entropie idéale serait d'utiliser un effet de physique quantique, ou quelque chose qui ne peut pas être modélisé avec des équations déterministes.
Un autre facteur important avec les générateurs de nombres aléatoires est que la source d'entropie ne peut générer qu'une quantité limitée d'entropie par unité de temps. Un bon exemple est le circuit chua: bien qu'il soit assez aléatoire, il a une très faible vitesse et ne peut pas être utilisé pour une application réelle.
Dans de nombreux processeurs / microcontrôleurs avec RNG intégrés, la dérive d'horloge de 2 à 4 horloges délibérément incorrectement synchronisées est utilisée. Ensuite, ils utilisent des filtres analogiques et numériques pour randomiser encore plus le motif et décaler le résultat dans un registre. La réalisation d'un tel filtrage nécessite quelques cycles, ce qui explique le nombre minimal de cycles requis sur une horloge donnée avant que la nouvelle valeur ne soit disponible.
La dérive de l'horloge n'est pas tout à fait un effet quantique, elle pourrait donc être modélisée, mais elle est suffisamment aléatoire, car elle dépend de nombreux paramètres, tels que la température, le processus du silicium, la fréquence de fonctionnement, le bruit électrique, les radiations de fond, etc. .
Dans les applications où le RNG matériel n'a pas un débit suffisant (comme dans les applications cryptographiques très exigeantes), il est assez courant d'utiliser le RNG matériel comme germe pour un générateur de nombres pseudo aléatoires comme la fonction rand () dans le sdtlib. Cependant, une telle application fournit généralement une meilleure implémentation de rand () qui est spécifiquement conçu pour fonctionner à partir d'une graine qui peut être rejetée très souvent avec de vraies valeurs aléatoires. Dans les processeurs Intel plus récents avec des RNG matériels intégrés, la partie de l'algorithme pseudo-aléatoire est directement intégrée dans le silicium, elle est donc effectuée par le matériel, ce qui donne un débit aléatoire très élevé.
Si vous vous souciez de la méthode rand () elle-même, ce n'est qu'une expression méthématique qui est conçue pour générer une quantité d'entropie suffisamment importante. Assez grand étant dépendant de l'application: pour les générations de clés cryptographiques, le caractère aléatoire doit être de meilleure qualité que le caractère aléatoire requis pour un simple mélange aléatoire dans votre lecteur de musique préféré. Il est évident que plus la qualité de la sortie aléatoire est élevée, plus le coût de calcul du nombre aléatoire est élevé.
Les opérations impliquées dans un nombre aléatoire sont assez similaires à celles impliquées dans le calcul du hachage MD5 d'un fichier: elles essaient d'utiliser une sorte d'effet d'avalanche de bits de sorte qu'un seul changement de bit dans une valeur de départ modifie l'ensemble du modèle de génération. En remarque, je ne recommande PAS d'utiliser MD5 comme générateur de nombres pseudo-aléatoires; ce n'était qu'un exemple. Ce serait à la fois inefficace et pas si aléatoire, mais le point est là: si vous alimentez le même fichier à un algorithme de hachage MD5, vous obtiendrez toujours la même sortie déterministe, à peu près de la même manière que vous obtiendrez toujours la même sortie de la fonction rand () si vous entrez la même graine, sauf si votre implémentation dépend de certains éléments arbitraires tels que l'heure actuelle.