- PVSM.RU - https://www.pvsm.ru -
Кто пытается арифметическими методами генерировать случайные числа, тот, конечно, живет во грехе.
— Джон фон Нейман
Есть такой хороший сервис random.org [1], который уже не раз упоминался на хабре. Основная задача сайта — генерация случайных чисел с использованием атмосферных шумов. На том же сайте можно найти результаты тестов и сравнения случайных и псевдослучайных генераторов с объяснениями что лучше и почему. В данной статье описывается простенькая библиотека для использования API сайта.
На Random.org очень много полезных функций, которые используют генерацию случайных чисел: бросание монеты, кубиков, тасование карт, получение лотерейной комбинации, генерация звуков, битмапов и многое другое. Также есть кастомная генерация за заданным распределением. В принципе, все это не сложно, но интересен тот факт, что генерация происходит с использованием атмосферных шумов и это каким-то магическим образом позволяет получить лучший рандом чем Random.nextInt(). Тут то я подумал, что неплохо бы иметь в запасе библиотеку с таким API и решил её написать.
Перед тем как писать, нужно поискать, может кто-нибудь уже делал такое. Да. Делал.
В общем, я решил написать свою.
Random.org предоставляет примитивное HTTP GET API, впрочем ничего большего не нужно. Есть всего 4 типа операций.
Генерирует случайные целые числа в заданном диапазоне. Например, так выглядит запрос на бросание двух кубиков:
http://www.random.org/integers/?num=2&min=1&max=6&col=1&base=10&format=plain&rnd=new [5]
Генерирует последовательность со всеми уникальными целыми числами в заданном диапазоне. По сути то, что делает Collections.shuffle(). Например, так выглядит запрос на перемешивания колоды карт:
http://www.random.org/sequences/?min=1&max=52&col=1&format=plain&rnd=new [6]
Генерирует случайную строку заданного размера с возможностью выбора набора символов (цифры, ловер кейс, аппер кейс). Вот так, например, можно сгенерить ник своему персонажу пароль:
http://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new [7]
Ну и как вы уже поняли, все это не бесплатно. Хотя не, дают миллион бесплатных бит в сутки. Этого более чем достаточно. А для того, чтобы узнать сколько осталось можно по следующей ссылке:
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
Нажмите здесь для печати.