Является ли `/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