Есть такой хороший сервис 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 типа операций.
Как определить случайного победителя с помощью random.org
Integer Generator
Генерирует случайные целые числа в заданном диапазоне. Например, так выглядит запрос на бросание двух кубиков:
http://www.random.org/integers/?num=2max=6base=10rnd=new
Sequence Generator
Генерирует последовательность со всеми уникальными целыми числами в заданном диапазоне. По сути то, что делает Collections.shuffle(). Например, так выглядит запрос на перемешивания колоды карт:
http://www.random.org/sequences/?min=1col=1rnd=new
String Generator
Генерирует случайную строку заданного размера с возможностью выбора набора символов (цифры, ловер кейс, аппер кейс). Вот так, например, можно сгенерить ник своему персонажу пароль:
http://www.random.org/strings/?num=1digits=onloweralpha=onformat=plain 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 килобайт).
Источник: habr.com
Функция random — генератор псевдослучайных чисел
Бывают ситуации, когда требуется, чтобы результат работы программы был случайным в определенных пределах. Для реализации такой возможности во многих языках программирования присутствуют встроенные функции, код которых выдает случайные числа. На самом деле числа не совсем случайные, а псевдослучайные. Дело в том, что искусственно реализовать случайность невозможно. Обычно берется некоторый коэффициент и с его помощью вычисляется каждое последующее «случайное» число.
🎲 Как работает Random в играх
В языке программирования Pascal для генерации псевдослучайных чисел в заданных диапазонах используется функция random.
Перед ее использованием обычно выполняется процедура инициализации датчика случайных чисел — randomize; иначе программа всегда будет выдавать один и тот же результат. Randomize задает начальное значение последовательности, от которого вычисляются все последующие. При каждом запуске программы это значение будет разным, а значит и результат работы функции random будет различным.
Вызов функции random() без аргументов возвращает вещественное случайное число в диапазоне от нуля (включительно) до единицы, то есть [0, 1).
var a, b: real; begin randomize; a := random(); writeln(a:6:4); b := random(); writeln(b:4:2); end.
0.5023 0.15
Если в скобках функции random() указан параметр, то она возвращает целое число от 0 до указанного в скобках (не включая само значение). Так выражение random(10) говорит о том, что будет получено любое число в диапазоне [0, 10).
var a, b: integer; begin randomize; a := random(10); writeln(a); b := random(-20); writeln(b); end.
7 -14
Если требуется получать значения в каком-либо другом диапазоне (не от нуля), то прибегают к математической хитрости. Например, чтобы получить случайное число от -100 до 100 достаточно записать такое выражение: random(200) — 100 . В результате его выполнения сначала будет получено число из диапазона [0, 199], а затем из него будет вычтена сотня. И если случайное число было меньше 100, то результат выражения будет отрицательным.
В программе ниже сначала с помощью процедуры randomize инициализируется датчик случайных чисел. Далее переменной n присваивается случайное значение в диапазоне [5, 12). Значение n используется для определения количества повторов цикла for. В цикле for генерируются случайные числа в диапазоне [-50, 49) и выводятся на экран.
var n, i, x: integer; begin randomize; n := random(7) + 5; for i := 1 to n do begin x := random(100) — 50; write(‘ ‘, x) end; writeln; end.
0 38 23 -34 -13 -42 47
Рассмотрим более сложную задачу. Допустим, надо сгенерировать случайное целое число в пределах диапазона, границы которого вводит пользователь с клавиатуры. Аналогичным образом требуется получить случайное вещественное число и случайный символ. Введем переменные:
- min_i, max_i — минимальная и максимальная границы диапазона для целого числа;
- n_i — случайное целое число;
- min_f, max_f — минимальная и максимальная границы диапазона для вещественного числа;
- n_f — случайное вещественное число;
- first_c, last_c — первый и последний символ диапазона, в котором должен быть сгенерирован случайный символ;
- min_c, max_c — коды-числа, соответствующие указанным символам;
- n_c — случайное число, которое будет переведено в символ по таблице ASCII.
Программа на языке Паскаль:
var min_i, max_i, n_i: integer; min_f, max_f, n_f: real; first_c, last_c: char; min_c, max_c, n_c: byte; begin randomize; write(‘Minimum integer: ‘); readln(min_i); write(‘Maximum integer: ‘); readln(max_i); n_i := random(max_i-min_i+1) + min_i; writeln(n_i); write(‘Minimum float: ‘); readln(min_f); write(‘Maximum float: ‘); readln(max_f); n_f := random() * (max_f-min_f) + min_f; writeln(n_f:5:2); write(‘First char: ‘); readln(first_c); write(‘Last char: ‘); readln(last_c); min_c := ord(first_c); max_c := ord(last_c); n_c := random(max_c-min_c+1) + min_c; writeln(chr(n_c)); end.
Пример выполнения программы:
Minimum integer: -100 Maximum integer: 100 -46 Minimum float: 0.23 Maximum float: 0.85 0.53 First char: k Last char: q p
Источник: pas1.ru
Как работают генераторы случайных чисел и насколько случайный результат они выдают?
Подбрасывая монетку, можно быть уверенным, что шансы выпадения орла и решки одинаковы. Но можно зайти на сайт с генерацией рандомных чисел или скачать приложение на телефон, в котором будет возможность имитировать бросок монетки. Однако будет ли в таком случае результат действительно случайным, или же программа подберет число/результат, который заранее был известен?
Генератор псевдослучайных чисел
В большинстве случаев результат не будет действительно случайным, он будет получен алгоритмом, выдающим последовательность чисел близкую к случайной. Подобных алгоритмов очень много, и все они используют различные формулы, однако они все зацикливаются и могут выдать ограниченное количество цепочек «случайных» чисел.
Хорошим и простым примером будет один из самых ранних алгоритмов для генерации псевдослучайных чисел. Например, трехзначное число возводится в квадрат, затем из середины квадрата числа берётся трехзначное число, которое и становится результатом. А производя подобные вычисления несколько раз подряд, получается цепочка псевдослучайных чисел.
Выглядит это так: допустим начальное значение 111, в таком случае 111² = 12321, получаем результат 232, после чего повторяем процедуру — 232² = 53824 и результатом становится 382. Чтобы подбор чисел не был постоянно одинаковым, важно чтобы начальное значение было разным при запуске алгоритма. Так, например, программы могут брать начальное значение исходя из даты и времени, когда был запущен алгоритм/приложение.
Большинство игр, приложений и сайтов используют именно генераторы псевдослучайных чисел, поскольку это значительно проще в реализации, а результат может быть получен мгновенно и без подключения к сети. Однако предсказуемость подобного генератора совершенно не подходит для использования его в целях шифрования данных. Тут на помощь приходит генератор истинно случайных чисел.
Генератор истинно случайных чисел
Простейшим истинным генератором случайных чисел является игральный кубик. Однако создать большой массив данных кидая кубик едва ли получится, а чтобы узнать результат даже одного броска, требуется время. Поэтому современные генераторы случайных чисел используют данные, полученные измерением различных физических процессов. Например, используют шум в электрических цепях, атмосферный шум, космическое излучение, колебания электромагнитного поля вакуума или шум радиоактивного распада атомов. Полученные данные являются абсолютно случайными и никак не могут быть предсказаны.
Недостатком подобноных генераторов является относительно медленная скорость выдачи результата, все же передача данных занимает больше времени, чем получение результата путем расчета по алгоритму. Однако уверенность в получении случайного числа важна во многих сферах. Но несмотря на сложность генераторов случайных чисел ими может воспользоваться каждый. Есть большое количество сайтов предоставляющих такую возможность (обычно, если сайт использует генератор истинно случайных чисел, то об этом есть информация).
Источник: www.ixbt.com