Кто пытается арифметическими методами генерировать случайные числа, тот, конечно, живет во грехе.
— Джон фон Нейман
Есть такой хороший сервис random.org, который уже не раз упоминался на хабре. Основная задача сайта — генерация случайных чисел с использованием атмосферных шумов. На том же сайте можно найти результаты тестов и сравнения случайных и псевдослучайных генераторов с объяснениями что лучше и почему. В данной статье описывается простенькая библиотека для использования 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
Генерирует последовательность со всеми уникальными целыми числами в заданном диапазоне. По сути то, что делает Collections.shuffle(). Например, так выглядит запрос на перемешивания колоды карт:
http://www.random.org/sequences/?min=1&max=52&col=1&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
Ну и как вы уже поняли, все это не бесплатно. Хотя не, дают миллион бесплатных бит в сутки. Этого более чем достаточно. А для того, чтобы узнать сколько осталось можно по следующей ссылке:
http://www.random.org/quota/?format=plain
Если вы кликали на три предыдущие ссылки, то вы уже потратили ~1500 бит.
В случае успеха генерации, сервер возвращает код 200, неудачи — код 503. Вот и все ошибки.
Для этого API была написана библиотека из пяти классов на Java, в котором вызов всех вышеописанных методов в простой и понятной форме.
Вроде и все. На github можете посмотреть исходники и скачать либу с оригинальным названием randomorg (6 килобайт).
— Джон фон Нейман
Есть такой хороший сервис random.org, который уже не раз упоминался на хабре. Основная задача сайта — генерация случайных чисел с использованием атмосферных шумов. На том же сайте можно найти результаты тестов и сравнения случайных и псевдослучайных генераторов с объяснениями что лучше и почему. В данной статье описывается простенькая библиотека для использования API сайта.
Random.org
На Random.org очень много полезных функций, которые используют генерацию случайных чисел: бросание монеты, кубиков, тасование карт, получение лотерейной комбинации, генерация звуков, битмапов и многое другое. Также есть кастомная генерация за заданным распределением. В принципе, все это не сложно, но интересен тот факт, что генерация происходит с использованием атмосферных шумов и это каким-то магическим образом позволяет получить лучший рандом чем Random.nextInt(). Тут то я подумал, что неплохо бы иметь в запасе библиотеку с таким API и решил её написать.
Поиск
Перед тем как писать, нужно поискать, может кто-нибудь уже делал такое. Да. Делал.
- Simple Random.Org Java Api — простая либа с методом для генерации целых чисел, но тянет зависимость Apache HTTP Client, аж целых 658 килобайт.
- Java TRNG client — тут уже все серьезнее. 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
Sequence Generator
Генерирует последовательность со всеми уникальными целыми числами в заданном диапазоне. По сути то, что делает Collections.shuffle(). Например, так выглядит запрос на перемешивания колоды карт:
http://www.random.org/sequences/?min=1&max=52&col=1&format=plain&rnd=new
String Generator
Генерирует случайную строку заданного размера с возможностью выбора набора символов (цифры, ловер кейс, аппер кейс). Вот так, например, можно сгенерить
http://www.random.org/strings/?num=1&len=12&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new
Quota Checker
Ну и как вы уже поняли, все это не бесплатно. Хотя не, дают миллион бесплатных бит в сутки. Этого более чем достаточно. А для того, чтобы узнать сколько осталось можно по следующей ссылке:
http://www.random.org/quota/?format=plain
Если вы кликали на три предыдущие ссылки, то вы уже потратили ~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 можете посмотреть исходники и скачать либу с оригинальным названием randomorg (6 килобайт).