Вот очень случайные мысли о генераторах случайных чисел.

Случайное число - это число, сгенерированное с использованием широкого набора чисел и математического алгоритма, который дает равную вероятность всем числам, встречающимся в указанном распределении. Генератор случайных чисел (ГСЧ) - это устройство, которое генерирует последовательность чисел или символов, которую невозможно предсказать лучше, чем на основе случайного случая.

Я работал над дополнительным проектом, который включал генерацию случайных чисел. Когда я писал для него стресс-тест, я заметил закономерность, согласно которой все числа были уникальными. Чтобы обеспечить некоторый контекст вокруг проекта, языком программирования является C; пространство случайных чисел от 0 до INT_MAX (2147483647 для 32 бит), а ОС - macOS Mojave для этого конкретного проекта.

Уникальность генерации случайных чисел мне показалась ошибкой. Одно из подозрений заключалось в том, что я генерирую только 1 тыс. Чисел, и, учитывая слишком большой размер выборки, вероятность повторения ничтожно мала. Итак, я решил сгенерировать 214748364 (INT_MAX / 10) случайных чисел, чтобы проверить свою гипотезу.

Я запускал ту же программу на Ubuntu и macOS.

Было сгенерировано 214748364 уникальных номера в macOS и 204364639 в Ubuntu 18.04. Наблюдение означает повторение ~ 4,83% на Ubuntu и отсутствие повторения на macOS, указывая на то, что есть некоторая разница в алгоритмах двух платформ (Linux и Unix). Когда я взглянул на код для генерации случайных чисел в macOS (https://opensource.apple.com/source/Libc/Libc-1353.11.2/stdlib/FreeBSD/rand.c), я был удивлен. Это самая основная форма ГПСЧ (генератор псевдослучайных чисел).

Как видите, генерация следующего случайного числа зависит от предыдущего случайного числа. Этот факт не относится к Ubuntu. Генератор случайных чисел является частью ядра. Следовательно, дистрибутив Linux менее важен, будь то Ubuntu, KaOS, Fedora, RedHat и т. Д. Когда я посмотрел на код для генерации случайных чисел в Linux (https://git.kernel.org/pub/scm/ linux / kernel / git / torvalds / linux.git / tree / lib / random32.c? h = v5.7-rc3 ), я снова был застигнут врасплох. Это очень сложный алгоритм, и для его понимания не было доступной документации. Немного погуглив, я нашел эту исследовательскую статью https://eprint.iacr.org/2006/086.pdf (рекомендуется прочитать), которая пытается облегчить боль понимания этого.

Как видно на диаграмме, энтропия для генерации случайности основана на множестве факторов, таких как входные данные и прерывания.

Действительно, невозможно сгенерировать действительно случайные числа, но я ожидал от macOS, что это не уменьшит пространство, доступное для генерации случайных чисел. Случайные числа необходимы в криптографии (https://www.commonlounge.com/discussion/481152258acb4003a5903d2fc1bc425f) и сетевой безопасности (https://blog.cloudflare.com/why-randomness-matters/). Когда в нашей жизни становится все больше и больше онлайн, меня это не устраивает.

И здесь заканчиваются мои случайные тирады и факты.