Ответ 1
Вы являетесь жертвой общего недоразумения в отношении случайных чисел в целом: случайная последовательность не означает, что число не может быть повторено в этой последовательности. Напротив, он должен с высокой вероятностью. Это неверное представление фактически используется, чтобы рассказать о "случайной" последовательности, порожденной людьми от реальной. "Случайная" последовательность 0 и 1, порожденная человеком, вероятно, будет выглядеть следующим образом:
0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0,....
в то время как реальная случайная последовательность не стесняется повторять одно и то же число более двух раз. Хорошим примером является то, что статистические тесты также ищут повторение.
Оба типа генераторов имеют хорошие "статистические свойства"
Также распространенное недоверие в том, что криптографически безопасные случайные числа каким-то образом дают "гораздо более случайные" значения. Вероятность их статистической вероятности, вероятно, будет почти одинаковой, и оба будут хорошо работать в этих стандартных статистических тестах.
Где использовать
Таким образом, это действительно зависит от того, что вы хотите сделать, будь то ваш выбор должен быть PRNG или криптографически безопасным PRNG (CSPRNG). "Нормальные" PRNG прекрасно подходят для целей моделирования, таких как методы Монте-Карло и т.д. Дополнительным преимуществом CSPRNG будет то, что вы несегментируете. Поскольку CSPRNG может "делать больше", шансы высоки, что его производительность также будет хуже, чем у ванильного PRNG.
Можно показать, что понятие "защищенного" PRNG тесно связано с возможностью предсказать следующий бит его выхода. Для CSPRNG предсказание следующего бита его выхода в любое время является вычислительно неосуществимым. Это справедливо только в том случае, если вы относитесь к его семенной ценности как к секрету, конечно. Как только кто-то узнает семя, все становится легко предсказуемым - просто пересчитайте значения, уже созданные алгоритмом CSPRNG, а затем вычислите следующее значение. Можно также показать, что отсутствие иммунитета к "предсказанию следующего бита" фактически означает, что статистического теста вообще не существует, что могло бы отличить распределение CSPRNG от распределения реального случайного равномерного распределения. Таким образом, существует еще одна разница между PRNG и CSPRNG: хотя хороший PRNG будет хорошо работать во многих статистических тестах, CSPRNG гарантированно будет хорошо работать во всех тестах.
Эмпирическое правило, в котором следует использовать то, что
- Вы используете CSPRNG во "враждебной" среде, где вы не хотите, чтобы внешние пользователи могли угадать конфиденциальную информацию (идентификаторы сеансов, онлайн-покер, где реальные деньги выигрываются/теряются,....).
- И PRNG в доброжелательной среде, где вы просто нуждаетесь в хороших статистических свойствах, но не заботитесь о предсказуемости (моделирование в Монте-Карло, однопользовательский покер против компьютера, компьютерные игры в целом) - то есть не может быть выиграно ни денег, ни жизнь будет потеряна, если кто-то сможет предсказать эти случайные числа успешно.