Відповідь Дейва досить приємно відновити, але щоб уточнити трохи більше щодо другого варіанту:
справжній апаратний генератор випадкових чисел використовує фізичне джерело ентропії. Таким джерелом ентропії може бути космічне випромінювання, електричний шум, ефект аванлана від діода із зворотним зміщенням (або транзистор BJT), ланцюга чуа тощо. Чим менше детермінованого джерела ентропії, тим краща якість випадкового виходу. Ідеальним джерелом ентропії було б використовувати ефект квантової фізики або щось, що неможливо змоделювати за допомогою детермінованих рівнянь.
Ще одним важливим фактором генераторів випадкових чисел є те, що джерело ентропії може генерувати лише обмежену кількість ентропії за одиницю часу. Хорошим прикладом є схема чуа: хоча вона є досить випадковою, вона має дуже низьку швидкість і не може бути використана для реальної програми.
У багатьох процесорних / мікроконтролерах із вбудованими RNG використовуються тактові переміщення від 2 до 4 годин, які навмисно неправильно синхронізовані. Потім вони використовують як аналогові, так і цифрові фільтри, щоб ще більше рандомізувати шаблони та зміни результату в регістрі. Для здійснення такої фільтрації потрібно кілька циклів, що пояснює мінімальну кількість циклів, необхідних для заданого годинника, перш ніж з'явиться нове значення.
Перенесення годинника - не зовсім квантовий ефект, тому його можна було б моделювати, але це досить випадково, оскільки це залежить від багатьох параметрів, таких як температура, процес кремнію, частота роботи, електричний шум, випромінювання фону тощо .
У додатках, де апаратні RNG не мають достатньої потужності (наприклад, у надзвичайно вимогливих криптографічних додатках), досить часто застосовується апаратний RNG як насіння для генератора псевдовипадкових чисел, такого як функція rand () у sdtlib. Однак такі програми зазвичай забезпечують кращу реалізацію rand (), яка спеціально розроблена для запуску із насіння, яке може дуже часто відкидатися з справжніми випадковими значеннями. У новіших процесорах Intel з інтегрованими апаратними RNG частина псевдовипадкових алгоритмів безпосередньо інтегрована в кремній, тому його виконують апаратно, даючи дуже високу випадкову віддачу.
Якщо ви пам’ятаєте про сам метод rand (), це лише математичний вираз, покликаний генерувати достатньо велику кількість ентропії. Досить велика, залежна від програми: для генерації криптографічних ключів випадковість повинна бути вищої якості, ніж випадковість, необхідна для простого випадкового перетасування улюбленого музичного плеєра. Очевидно, що чим вище якість випадкового виходу, тим вище обчислювальна вартість випадкового числа.
Операції, що беруть участь у випадковому числі, досить схожі на операції, що беруть участь у обчисленні хеша MD5 файлу: вони намагаються використовувати своєрідний ефект лавинної лавини, щоб одна зміна бітів у значенні насіння змінила всю форму генерування. Як бічну зауваження, я НЕ рекомендую використовувати MD5 як генератор псевдовипадкових чисел; це був лише приклад. Це було б і неефективно, і не настільки випадково, але справа в тому: якщо ви подаєте один і той же файл в алгоритм хеджування MD5, ви завжди отримаєте той самий детермінований вихід, майже такий самий спосіб, як ви завжди отримували б один і той же результат від функція rand (), якщо ви вводите одне насіння, якщо ваша реалізація не залежить від деяких довільних елементів, таких як поточний час.