Является ли `/dev/urandom` подходящим для целей моделирования?

Похоже, что использование простой C в unix-подобных системах, fread из /dev/urandom - это самый простой способ извлечения высококачественных случайных байтов. Мне нужно запустить симуляцию, которая требует около 10k 32-битных случайных чисел в секунду, и может работать несколько дней. Можно ли использовать /dev/urandom для этой цели? Как качество случайных байтов здесь, когда пул энтропии исчерпан?

edit_1

Пока я выполняю 3 параллельных теста на /dev/urandom в моем ноутбуке, я получил следующие интересные строки. Тест еще не завершен.

#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
 diehard_parking_lot|   0|     12000|     100|0.99573896|   WEAK
        diehard_sums|   0|       100|     100|0.00116464|   WEAK
          sts_serial|   7|    100000|     100|0.99996076|   WEAK

Ответ 1

В базовой реализации /dev/urandom есть CSPRNG, выходной пул которого имеет максимальный период меньше 2 ^ (26 * 32) - 1, который затем подается в SHA-1 для получения выхода для /dev/urandom. Таким образом, urandom может, очевидно, производить количество случайных чисел, которое вы хотите, однако оно не может предоставить вам воспроизводимые результаты - вам придется кэшировать последовательность, которую вы получаете.

Вам не нужно беспокоиться о том, что произойдет, когда подсчет энтропийного пула будет исчерпан, /dev/urandom выдаст все, что вы его запросите. "Теоретические атаки", о которых говорится в man-странице urandom (4), - это nonexistent. ( "проблема" - огромное непонимание того, что такое "оценка энтропии" )

Существует много других PRNG с большими периодами, которые воспроизводят посев: Mersenne Twister в С++, xorshift PRNG и т.д. Вы должны иметь возможность адаптировать любой PRNG к дистрибутиву, который подходит для ваших целей.

Ответ 2

Нет,/dev/random и /dev/urandom предназначены для криптографических приложений, где требуется высокая энтропия в обмен на скорость. Они работают очень медленно по сравнению с хорошим не-CS PRNG, и поэтому не дадут вам достаточного количества образцов для моделирования или интеграции в Монте-Карло.

Для этого используйте быстрый, но качественный PRNG, такой как XOR-shift + или Mersenne Twister. Вы можете засеять PRNG данными из /dev/urandom, если вам не нужна повторяемость.

Ответ 3

Нет, вы не должны интенсивно использовать /dev/urandom, по крайней мере, согласно документации [хотя, если вы читаете поток комментариев, вы найдете аргумент, что документация вводит в заблуждение]:

Генератор случайных чисел ядра предназначен для получения небольшого количества высококачественного затравочного материала для посева криптографического генератора псевдослучайных чисел (CPRNG). Он предназначен для обеспечения безопасности, а не для скорости, и плохо подходит для создания большого количества случайных данных. Пользователи должны быть очень экономичными в количестве затравочного материала, который они читают из /dev/urandom (и/dev/random); ненужное чтение большого количества данных с этого устройства окажет негативное влияние на других пользователей устройства. (Источник: linux man 4 random)

Ранние (до 2.6) реализации linux /dev/urandom разделили пул энтропии между /dev/random и /dev/urandom, но в наши дни используемые пулы несколько независимы, а чтение из /dev/urandom не повлияет на доступность /dev/random. Другие операционные системы используют разные стратегии. Например, во FreeBSD существует только одно случайное устройство, которое блокируется при запуске системы.

В целом моя рекомендация заключается в том, что энтропия рассматривается как ресурс и не потребляется в больших количествах при отсутствии явной необходимости, если только по какой-либо другой причине, кроме как избежать чрезмерно частых и ненужных системных вызовов, которые относительно дороги.

В любом случае, для моделирования monte carlo, где криптографическая случайность не требуется, вы должны быть в порядке с хорошим PRNG; для независимых испытаний вы должны забрать PRNG с одного чтения /dev/urandom. (Сеяние от time(NULL) никогда не является хорошей идеей.)

Ответ 4

Что касается "качества случайных байтов из [ /dev/urandom], когда пул энтропии исчерпан", О'Нил (2014) указывает, что разработчики генераторов для криптографических целей "не имеют одинаковой озабоченности относительно статистических свойств (например, однородность) по сравнению с генераторами случайных чисел общего назначения".

Это может объяснить, почему вывод /dev/urandom не дает статистических тестов, хотя консенсус, по-видимому, заключается в том, что вывод /dev/urandom хорош даже после истощения.

Если вы хотите объединить свойства /dev/urandom и стандартного генератора для целей моделирования, таких как Mersenne Twister, мое предложение было бы обойти оба потока данных. Подходы достаточно разные, что они не должны отменять друг друга.

Ссылка: http://www.pcg-random.org/paper.html