Как сгенерировать хорошее случайное число?

Посмотреть в Telegram: @JavaSobes/291
Этот вопрос глубже, чем кажется на первый взгляд. Для начала, нужно разобраться в двух понятиях: псевдослучайные, и истинно случайные числа.

Псевдослучайные числа – это последовательность случайных на вид чисел, на самом деле полученных в результате математического алгоритма. Последовательность таких чисел можно воспроизвести, зная начальные условия (seed, энтропия) и используемый алгоритм. Метод, который используется для генерации чисел в классе java.util.Random, дает криптографически ненадежные псевдослучайные числа – злоумышленник может достаточно легко их предугадывать.

Истинно случайные числа основываются на физических свойствах, которые трудно поддаются измерению. Это могут быть, например, доли секунд текущего системного времени. Алгоритм генерации истинно случайных чисел не позволяет с хорошей точностью угадать следующее число, даже зная предыдущие.

Класс SecureRandom предоставляет доступ к криптографически надежным генераторам случайных чисел. При том, это могут быть как достаточно сложные последовательности псевдослучайных, так и истинно случайные числа. Согласно стандартам безопасности, они будут достаточно непредсказуемы.

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

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