Здравствуйте.
Как известно, создать истинный генератор случайных чисел на компьютере нереально, ибо отсутствует то, что генерирует энтропию.
То есть, как не пыхти - это все равно будет псевдослучайное число, где отсутствует истинно случайный компонент.
за подробностями - сюда 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 вставок в массив. И каждый раз результат был иным. Чем не энтропийный источник? А главное - просчитать это заранее невозможно.
Как-то я выполнял задачу - найти, сколько времени занимает выполнение той или иной операции. Например 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());
}
}
}
Вкратце - есть блок, создающий энтропию, который возвращает время вычисления. Я думал просто взять последнюю цифру - но беда, распределение получается далеким от равномерного. Поэтому эти числа можно обычным ГПСЧ разнообразить)))
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Для реальных задач, требующих настоящей случайности (генерация ключей, шифрование) и предъявляющей серьезные к ней требования, применяют «железный» генератор энтропии в виде платы расширения, в котором оцифровывается шум специального резистора. Всё это дело сертифицируется определенными органами (в России сертификацией всякого шифрования, вроде, ФСБ заведует). Без настоящей случайности из реального мира ГСЧ не допустят к серьезному применению.
Что касается более бытовых вещей, этот способ вполне применим, разве что время тратит на возню со списком. Еще часто применяют как seed для стандартного ГСПЧ системное время каких-либо пользовательских действий: запуск программы, нажатие каких-либо кнопок, какая-нибудь характеристика движения указателя мыши и т.п.