JavaRush /Java блог /Архив info.javarush /Пробую создать генератор случайных чисел с энтропийной со...
turboblufer
15 уровень

Пробую создать генератор случайных чисел с энтропийной составляющей

Статья из группы Архив info.javarush
Здравствуйте. Как известно, создать истинный генератор случайных чисел на компьютере нереально, ибо отсутствует то, что генерирует энтропию. То есть, как не пыхти - это все равно будет псевдослучайное число, где отсутствует истинно случайный компонент. за подробностями - сюда https://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB однако я совершенно случайно обнаружил, как можно генерировать энтропию (хотя "собрать" - более подходящий термин).
Как-то я выполнял задачу - найти, сколько времени занимает выполнение той или иной операции. Например 1000 вставок в массив. И каждый раз результат был иным. Чем не энтропийный источник? А главное - просчитать это заранее невозможно. public class RandomGenerator { static int count0; static int count1; static int count2; static int count3; static int count4; static int count5; static int count6; static int count7; static int count8; static int count9; public static void main(String[] args) { int length = 100; long numberSequence[] = new long[length]; long lastDigit; for (int i = 0; i "+lastDigit); if (lastDigit ==0) count0++; if (lastDigit ==1) count1++; if (lastDigit ==2) count2++; if (lastDigit ==3) count3++; if (lastDigit ==4) count4++; if (lastDigit ==5) count5++; if (lastDigit ==6) count6++; if (lastDigit ==7) count7++; if (lastDigit ==8) count8++; if (lastDigit ==9) count9++; } System.out.println(""); System.out.println("--------------------------------------------------------"); System.out.println(""); System.out.println(""); System.out.println("Генератор случайных чисел закончил работу"); System.out.println("Всего генерированно чисел, значение которых равно 0 -> "+count0); System.out.println("Всего генерированно чисел, значение которых равно 1 -> "+count1); System.out.println("Всего генерированно чисел, значение которых равно 2 -> "+count2); System.out.println("Всего генерированно чисел, значение которых равно 3 -> "+count3); System.out.println("Всего генерированно чисел, значение которых равно 4 -> "+count4); System.out.println("Всего генерированно чисел, значение которых равно 5 -> "+count5); System.out.println("Всего генерированно чисел, значение которых равно 6 -> "+count6); System.out.println("Всего генерированно чисел, значение которых равно 7 -> "+count7); System.out.println("Всего генерированно чисел, значение которых равно 8 -> "+count8); System.out.println("Всего генерированно чисел, значение которых равно 9 -> "+count9); } public static long getTimeMsOfInsert(ArrayList list) { long currentTime = new Date().getTime(); insert10000( list ); return new Date().getTime() - currentTime; } public static void insert10000(List list) { for (long i=0;i<70000;i++) /* чем выше это число, тем ближе распределение "время вычисления%10" к равномерному, однако время вычислений растет. Если увеличить этот параметр, то можно отказаться от randomizer */ { list.add(0, new Object()); } } } Вкратце - есть блок, создающий энтропию, который возвращает время вычисления. Я думал просто взять последнюю цифру - но беда, распределение получается далеким от равномерного. Поэтому эти числа можно обычным ГПСЧ разнообразить)))
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
EvIv Уровень 30
13 августа 2014
Это тоже ГСПЧ, так как реального источника энтропии здесь нет. Время добавления кучи элементов в список зависит от тех же компьютерных алгоритмов (распределение процессорного времени и ресурсов памяти между потоками, работа gc и прочее), другое дело что часть их принадлежит ОС и JVM.
Для реальных задач, требующих настоящей случайности (генерация ключей, шифрование) и предъявляющей серьезные к ней требования, применяют «железный» генератор энтропии в виде платы расширения, в котором оцифровывается шум специального резистора. Всё это дело сертифицируется определенными органами (в России сертификацией всякого шифрования, вроде, ФСБ заведует). Без настоящей случайности из реального мира ГСЧ не допустят к серьезному применению.
Что касается более бытовых вещей, этот способ вполне применим, разве что время тратит на возню со списком. Еще часто применяют как seed для стандартного ГСПЧ системное время каких-либо пользовательских действий: запуск программы, нажатие каких-либо кнопок, какая-нибудь характеристика движения указателя мыши и т.п.