Генератор псевдослучайных чисел с равномерным, нормальным и логнормальным распределением своими руками
Рассматриваем распределение случайных величин для генератора
- Описание
- Подробнее
Описание
Генератор псевдослучайных чисел
Введение в проблему
Проблема случайных чисел начинается с того, что пока не существует ни одного генератора случайных чисел. Быть может, некоторые читатели возразят, и будут настаивать на том, что непосредственно человек является генератором случайных чисел. Но, к сожалению, это не так. Если попросить респондента загадать случайное число, то с высокой долей вероятности это будет число из промежутка от 0 до 20. Из этого интервала, скорее всего, будет загадано число «3», «7», «10», «12». Если же «случайное» число не будет принадлежать данному отрезку, то оно будет либо из повторяющихся цифр, например «111», «666» и так далее, либо будет кратно 10 («100», «1000»). Еще респонденты называют какие-то культовые числа, как то «42», «23», «13».
Таким образом, даже человек является своего рода генератором псевдослучайных чисел, и «программа», заложенная в нём – еще проще и более предсказуемо, чем машинная.
Тема создания качественного генератора псевдослучайных чисел не теряет своей актуальности и по сей день, так как псевдослучайные числа находят широчайшее применение в программировании, при создании игр с открытым миром, при розыгрышах призов, при создании прогнозов погоды, а также при моделировании сложных систем частиц (пылевое облако, имитация огня).
Кроме всего вышеперечисленного (данные вещи имеют явный развлекательный характер), псевдослучайные числа также применяются в криптографии, современном шифровании, создании «одноразовых» паролей, при передаче информации между пользователями.
В обозримом будущем при сохранении современных тенденций на развитие искусственного интеллекта, можно с твердой уверенностью говорить о переходе от генераторов псевдослучайных чисел к случайным, или, по крайней мере, псевдослучайные алгоритмы будут не такими предсказуемыми.
Способы решения
Генератор псевдослучайных чисел с равномерным распределением
Встроенный в Pascal генератор случайных чисел является эталоном для наших последующих экспериментов. Данное изображение было создано при использовании графических средств. Были созданы 5000 случайных чисел для x, 5000 – для y, а после по полученным значениям были построены точки с координатами (x, y).

Это похоже на равномерное распределение.
Возникла идея проанализировать распределение у цифр десятичной записи деления единицы на большое простое число.
Была создана простая программа в Pascal:
program pseudorandomnumbersgeneratorthree;
begin
writeln(1/9941);
end.
В результате: 0.000100593501659793
Очевидно, что для нашего эксперимента такой точности недостаточно. Самый большой тип данных в Pascal – real (действительные числа) – ограничен 1.7*10^38, поэтому возникла идея обратиться к Java.
«Я же просил 400 капель, а тут 402!»

Будем запрашивать текущее время в миллисекундах, проверять, является ли оно простым числом (если нет, то будем увеличивать его на 1 до тех пор, пока оно не станет простым), а дальше – находить величину, обратную ему и брать значения с 1 цифры, не равной 0, по 1001 цифру после запятой.
import java.math.BigDecimal;
import java.math.BigInteger;
public class testing {
public static void main(String[] args) {
BigDecimal input = BigDecimal.valueOf(1.0);
BigInteger helper = BigInteger.valueOf(1);
BigInteger input1 = BigInteger.valueOf((int)System.currentTimeMillis());
boolean primenumber = input1.isProbablePrime(100);
while (primenumber != true) {
input1 = input1.add(helper);
primenumber = input1.isProbablePrime(100);
}
if (primenumber) {
BigDecimal input3 = new BigDecimal(input1.toString());
BigDecimal input4 = input.divide(input3, 1001, BigDecimal.ROUND_DOWN);
System.out.println(input4);
}
}
}
Код реализации представлен выше.

