Каталог решений - Генератор псевдослучайных чисел с равномерным, нормальным и логнормальным распределением своими руками

Генератор псевдослучайных чисел с равномерным, нормальным и логнормальным распределением своими руками

Генератор псевдослучайных чисел с равномерным, нормальным и логнормальным распределением своими руками

В наличии

Рассматриваем распределение случайных величин для генератора

Категория:

Описание

Генератор псевдослучайных чисел

 

Введение в проблему

 

Проблема случайных чисел начинается с того, что пока не существует ни одного генератора случайных чисел. Быть может, некоторые читатели возразят, и будут настаивать на том, что непосредственно человек является генератором случайных чисел. Но, к сожалению, это не так. Если попросить респондента загадать случайное число, то с высокой долей вероятности это будет число из промежутка от 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);

}

}

}

Код реализации представлен выше.

 

 

has been added to your cart:
Оформление заказа