- PVSM.RU - https://www.pvsm.ru -

Генерация случайных чисел с помощью Random.org

Кто пытается арифметическими методами генерировать случайные числа, тот, конечно, живет во грехе.
— Джон фон Нейман

Есть такой хороший сервис random.org [1], который уже не раз упоминался на хабре. Основная задача сайта — генерация случайных чисел с использованием атмосферных шумов. На том же сайте можно найти результаты тестов и сравнения случайных и псевдослучайных генераторов с объяснениями что лучше и почему. В данной статье описывается простенькая библиотека для использования API сайта.

Random.org

На Random.org очень много полезных функций, которые используют генерацию случайных чисел: бросание монеты, кубиков, тасование карт, получение лотерейной комбинации, генерация звуков, битмапов и многое другое. Также есть кастомная генерация за заданным распределением. В принципе, все это не сложно, но интересен тот факт, что генерация происходит с использованием атмосферных шумов и это каким-то магическим образом позволяет получить лучший рандом чем Random.nextInt(). Тут то я подумал, что неплохо бы иметь в запасе библиотеку с таким API и решил её написать.

Поиск

Перед тем как писать, нужно поискать, может кто-нибудь уже делал такое. Да. Делал.

  • Simple Random.Org Java Api [2] — простая либа с методом для генерации целых чисел, но тянет зависимость Apache HTTP Client [3], аж целых 658 килобайт.
  • Java TRNG client [4] — тут уже все серьезнее. 40 килобайт и генерация чисел с помощью двух(!) сайтов. Да, недостаток в том, что либа создавалась для криптографии, потому там оперирование битами, байтами и вообще все сложно.

В общем, я решил написать свою.

API

Random.org предоставляет примитивное HTTP GET API, впрочем ничего большего не нужно. Есть всего 4 типа операций.

Integer Generator

Генерирует случайные целые числа в заданном диапазоне. Например, так выглядит запрос на бросание двух кубиков:
http://www.random.org/integers/?num=2&min=1&max=6&col=1&base=10&format=plain&rnd=new [5]

Sequence Generator

Генерирует последовательность со всеми уникальными целыми числами в заданном диапазоне. По сути то, что делает Collections.shuffle(). Например, так выглядит запрос на перемешивания колоды карт:
http://www.random.org/sequences/?min=1&max=52&col=1&format=plain&rnd=new [6]

String Generator

Генерирует случайную строку заданного размера с возможностью выбора набора символов (цифры, ловер кейс, аппер кейс). Вот так, например, можно сгенерить ник своему персонажу пароль:
http://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new [7]

Quota Checker

Ну и как вы уже поняли, все это не бесплатно. Хотя не, дают миллион бесплатных бит в сутки. Этого более чем достаточно. А для того, чтобы узнать сколько осталось можно по следующей ссылке:
http://www.random.org/quota/?format=plain [8]
Если вы кликали на три предыдущие ссылки, то вы уже потратили ~1500 бит.

Ошибки

В случае успеха генерации, сервер возвращает код 200, неудачи — код 503. Вот и все ошибки.

Для этого API была написана библиотека из пяти классов на Java, в котором вызов всех вышеописанных методов в простой и понятной форме.

// бросаем кубики
IntegerGenerator ig = new IntegerGenerator();
ig.generate(1, 6, 2);
// тасуем карты
SequenceGenerator sg = new SequenceGenerator();
sg.generate(1, 52);
// новый пароль
StringGenerator strg = new StringGenerator();
strg.generate(12, 1, true, true, true, true);
// сколько бит осталось
QuotaChecker qc = new QuotaChecker();
qc.quota();

Вроде и все. На github можете посмотреть [9] исходники и скачать [10] либу с оригинальным названием randomorg (6 килобайт).

Автор: mishadoff


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/9001

Ссылки в тексте:

[1] random.org: http://random.org

[2] Simple Random.Org Java Api: http://sourceforge.net/p/randomjapi/home/Home/

[3] Apache HTTP Client: http://hc.apache.org/httpclient-3.x

[4] Java TRNG client: http://sourceforge.net/projects/trng-random-org/

[5] http://www.random.org/integers/?num=2&min=1&max=6&col=1&base=10&format=plain&rnd=new: http://www.random.org/integers/?num=2&min=1&max=6&col=1&base=10&format=plain&rnd=new

[6] http://www.random.org/sequences/?min=1&max=52&col=1&format=plain&rnd=new: http://www.random.org/sequences/?min=1&max=52&col=1&format=plain&rnd=new

[7] http://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new: http://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new

[8] http://www.random.org/quota/?format=plain: http://www.random.org/quota/?format=plain

[9] посмотреть: https://github.com/mishadoff/randomorg

[10] скачать: https://github.com/mishadoff/randomorg/downloads