Шаблон генератора случайных чисел
- Алгоритмы рандома
- Про что статья
- C++ rand
- С++11 STL random
- PRNG — Pseudo-random Numbers Generator
- XorShift
- 8-bit рандом в эмуляторе z26
- Компактный рандом для Z80 от Joe Wingbermuehle
- Генератор рандома в DOOM
- RDRAND
- Концовка
- masterok
- Мастерок.жж.рф
- Хочу все знать
- Что такое ГСЧ – как работает генератор случайных чисел
- Истинный ГСЧ против псевдо ГСЧ
- Какие приложения используют ГСЧ
- Манипуляции с ГСЧ
- Почему геймеры ненавидят ГСЧ
- Кто такой RNGesus?
- Окончательный вердикт по ГСЧ – хорошо или плохо?
- Случайные числа не случайны
- FullStack CTO
- FullStack CTO
- Как создать генератор случайных чисел на JS и предсказать Math.random()
- Генератор псевдослучайных чисел и генератор случайных чисел
- Придумываем алгоритм ГПСЧ
- Линейный конгруэнтный ГПСЧ
- Как устроен Math.random()
- Предсказываем Math.random()
- Сrypto Random Values
- Материалы про Math.random()
- Генератор случайных чисел онлайн для конкурса, розыгрыша, лотереи бесплатно | Рандомайзер
- Онлайн-сервисы генерации случайных чисел
- Онлайн генератор случайных чисел Randstuff
- Рандомайзер случайных чисел онлайн на русском Castlots
- Рандомайзер случайных чисел
- Генератор случайных чисел для лотереи онлайн бесплатно
- Генератор случайных чисел для лотереи (ГСЧ) Gsgen
- Генератор случайных чисел для Лото Randomorg
- Онлайн генератор чисел для лотерей — 5 из 36, 6 из 45, 6 из 49, 7 из 49 — soft-arhiv
- Генераторы чисел для лотереи на официальном сайте Stoloto
- Программа генератор случайных чисел: скачать софт для выбора случайного числа
- Приложение генератор случайных чисел для Андроид
- Готовимся к собеседованию: случайные числа в Python
- Главное, что нужно помнить
- Вопрос 1. Что такое случайные числа?
- Вопрос 2. Как получить случайные числа в Python?
- Вопрос 3. Псевдослучайные числа
- Вопрос 4. Как повторить случайную последовательность?
- Вопрос 5. Красные и зелёные шары
- Вопрос 6. Нечестная монетка
- Вопрос 7. Проиллюстрируйте закон больших чисел
- Вопрос 8. Где применяются случайные числа?
- Случайности не случайны
Алгоритмы рандома
В этой статье вы увидите самые разнообразные велосипеды алгоритмы для генерации случайных чисел.
Про что статья
C++ rand
Первое что узнаёт начинающий программист С++ по теме получения рандома — функция rand, которая генерирует случайное число в пределах от 0 и RAND_MAX. Константа RAND_MAX описана в файле stdlib.h и равна 32’767, но этом может быть не так, например в Linux (см. коммент). Если же rand() в вашем компиляторе генерирует числа в пределах 32’767 (0x7FFF) и вы хотите получить случайное число большого размера, то код ниже можно рассматривать как вариант решения этой проблемы:
Реализация функции rand в старом C была проста и имела следующий вид:
Данная реализация имела не очень хорошее распределение чисел и ныне в C++ улучшена. Так же стандартная библиотека C++ предлагает дополнительные способы получения случайного числа, о которых ниже.
С++11 STL random
Данный сорт рандома появился в C++11 и представляет из себя следующий набор классов: minstd_rand, mt19937, ranlux, knuth_b и разные их вариации.
Чтобы последовательность случайных чисел не повторялась при каждом запуске программы, задают «зерно» псевдослучайного генератора в виде текущего времени или, в случае с некоторыми ретро (и не только) играми — интервалы между нажатиями клавиш с клавиатуры/джойстика. Библиотека random же предлагает использовать std::random_device для получения зерна лучше чем от time(NULL), однако в случае с компилятором MinGW в Windows функция практически не работает так как надо. До сих пор…
Некоторые из алгоритмов в STL random могут работать быстрее чем rand(), но давать менее качественную последовательность случайных чисел.
PRNG — Pseudo-random Numbers Generator
Можете считать это название — синонимом линейного конгруэнтного метода. PRNG алгоритмы похожи на реализацию rand в C и отличаются лишь константами.
PRNG алгоритмы быстро работают и легки в реализации на многих языках, но не обладают большим периодом.
XorShift
Алгоритм имеющий множество вариаций отличающихся друг от друга периодом и используемыми регистрами. Подробности и разновидности XorShift’а можете посмотреть на Википедии или Хабре. Приведу один из вариантов с последовательностью 2 в 128-й степени.
Данный генератор очень хорош тем, что в нём вообще нет операций деления и умножения — это может быть полезно на процессорах и микроконтроллерах в которых нету ассемблерных инструкций деления/умножения (PIC16, Z80, 6502).
8-bit рандом в эмуляторе z26
Z26 это эмулятор старенькой приставки Atari2600, в коде которого можно обнаружить рандом ориентированный на работу с 1-байтовыми регистрами.
Однажды мне пришлось сделать реализацию этого алгоритма для z80:
Компактный рандом для Z80 от Joe Wingbermuehle
Если вам интересно написание программ под машины с зилогом, то представляю вашему вниманию алгоритм от Joe Wingbermuehle (работает только на зилоге):
Генератор рандома в DOOM
В исходниках игры Дум есть такой интересный файл под названием m_random.c (см. код), в котором описана функция «табличного» рандома, то есть там вообще нет никаких формул и магии с битовыми сдвигами.
Приведу более компактный код наглядно показывающий работу этой функции.
Конечно же это ни какой не рандом и последовательность случайных чисел легко предугадать даже на уровне интуиции в процессе игры, но работает всё это крайне быстро. Если вам не особо важна криптографическая стойкость и вы хотите что-то быстро генерирующее «типа-рандом», то эта функция для вас. Кстати в Quake3 рандом выглядит просто — rand()&0x7FFF.
RDRAND
Некоторые современные процессоры способны генерировать случайные числа с помощью одной ассемблерной команды — RDRAND. Для использования этой функции в C++ вы можете вручную прописать нужные инструкции ассемблерными вставками или же в GCC подключить файл immintrin.h и выбрать любую из вариаций функции _rdrandXX_step, где XX означает число бит в регистре и может быть равно 16, 32 или 64.
Если вы увидите ошибку компиляции, то это значит, что вы не включили флаг -mrdrnd или ваш компилятор/процессор не поддерживает эту инструцию. Возможно это самый быстрый генератор случайных чисел, но есть вопросы в его криптографической стойкости, так что думайте.
Концовка
Класс std::minstd_rand из библиотеки STL random работает быстрее обыкновенного rand() и может стать его альтернативной заменой, если вас не особо волнует длинна периода в minstd. Возможны различия в работе этих функций в Windows и Unix’ах.
masterok
Мастерок.жж.рф
Хочу все знать
Широко распространённые генераторы случайных обычно основаны либо на математических преобразованиях, либо на измерениях состояния физической системы. Как бы ни были сложны математические формулы или физические законы, заложенные в принцип генератора, их последовательности чисел получаются псевдослучайными, потому что их теоретически можно восстановить.
Вот вам история из 90-х:
Представьте, что сейчас 1995 год и вы собираетесь совершить первую покупку в онлайне. Вы открываете браузер Netscape и прихлёбываете из чашечки кофе, пока главная страница медленно загружается. Ваш путь лежит на Amazon.com — новый онлайн-магазинчик, о которой рассказал вам друг. Когда наступает этап оформить покупку и ввести персональные данные, адрес в браузере меняется с «http» на «https». Это сигнализирует о том, что компьютер установил зашифрованное соединение с сервером Amazon. Теперь можно передавать серверу данные кредитной карты, не опасаясь мошенников, которые хотят перехватить информацию.
К сожалению, ваша первая покупка в интернете была скомпрометирована с самого начала: вскоре обнаружится, что якобы безопасный протокол, по которому браузер установил соединение, на самом деле не очень защищён.
Проблема в том, что секретные ключи, которые использовал Netscape, были недостаточно случайными. Их длина составляла всего 40 бит, что означает около триллиона возможных комбинаций. Это кажется большим числом, но хакерам удалось взломать эти коды, даже на компьютерах 1990-х годов, примерно за 30 часов. Якобы случайное число, которое Netscape использовал для генерации секретного ключа, базировалось всего на трёх значениях: времени суток, идентификационном номере процесса и идентификационном номере материнского процесса — все они являются предсказуемыми. Из-за этого злоумышленник имел возможность сократить количество вариантов для перебора и найти нужный ключ гораздо раньше, чем предполагали в Netscape.
Программисты Netscape с радостью бы использовали полностью случайные числа для генерации ключа, но не знали, как их получить. Причина в том, что цифровые компьютеры всегда находятся в точно определённом состоянии, которое меняется только при поступлении определённой команды от программы. Самое лучшее, что вы можете сделать — эмулировать случайность, генерируя так называемые псевдослучайные числа с помощью специальной математической функции. Набор таких чисел на первый взгляд выглядит полностью случайным, но кто-нибудь другой с помощью такой же процедуры может легко сгенерировать в точности такие же числа, так что обычно они плохо подходят для шифрования.
Исследователям удалось изобрести генераторы псевдослучайных чисел, которые признаны криптографически надёжными. Но их нужно запускать с качественного случайного начального значения (random seed), иначе они всегда сгенерируют один и тот же набор чисел. И для этого начального значения вам нужно нечто такое, что действительно невозможно подобрать или предсказать.
И вот группа ученых из МГУ разработала и сконструировала компактный высокоскоростной квантовый генератор истинно случайных чисел.
«Развитие современных квантовых технологий открыло новые перспективы для создания систем защищенной связи. Наиболее яркий пример — квантовая криптография. Для распределения секретных ключей в системах квантовой криптографии требуется большое количество случайных последовательностей 0 и 1. Для этих целей используются квантовые генераторы случайных чисел», — поясняет Сергей Кулик, доктор физико-математических наук, профессор кафедры квантовой электроники физического факультета МГУ.
Учёные МГУ разработали и сконструировали такой генератор, последовательности чисел которых можно считать истинно случайными. Дело в том, что в основе действия новой разработки лежат законы релятивистской, а не классической физики. Исследователям удалось оптимально выбрать и сгруппировать фотоотсчёты для исходной последовательности и добиться скорости генерации случайной последовательности скоростью в 64 Мбит/с, 75 Мбит/с и 100 Мбит/с. Сгенерированные последовательности успешно прошли статистические тесты NIST на случайность.
«Результаты измерений над квантовой системой, приготовленной каждый раз в одном и том же состоянии, носят принципиально случайный характер. Поэтому истинная случайность имеет место только в квантовой области», — заключил Сергей Кулик.
Случайные числа широко используются в различных областях науки и техники, например, при вычислении многомерных интегралов, моделировании различных процессов методом Монте-Карло. Наиболее широкое применение случайные числа находят в криптографии. Случайные последовательности используются для секретных ключей в системах симметричного шифрования, генерации паролей, PIN кодов для различных типов пластиковых карт, кодов аутентификации, вероятностных алгоритмов и систем квантового распределения ключей. Практически для всех упомянутых применений требуются случайные числа, полученные исключительно с физических генераторов.
При реализации квантовых генераторов случайных чисел принципиально важно иметь математически доказуемый и физически экспериментально проверяемый процесс измерений над системой, из которого генерируется исходная случайная последовательность. Это позволяет быть уверенным, что происхождение случайности действительно имеет квантовую природу.
Результаты исследования опубликованы в журнале Laser Physics Letters.
Что такое ГСЧ – как работает генератор случайных чисел
Генератор случайных чисел, как следует из названия, представляет собой процесс получения случайного числа каждый раз, когда это необходимо, без возможности установить шаблон из ранее сгенерированных чисел. Это число может быть сгенерировано либо алгоритмом, либо аппаратным устройством, и очень важно избежать любого предсказуемого результата.
Алгоритм генератора случайных чисел часто используется в видеоиграх, где он устанавливает разные результаты каждый раз, когда его запускают. Возможно, вы заметили, что даже если вы играете на одном уровне в игре, каждый раз, когда вы пытаетесь выполнить миссию, он не будет одинаковым. Различия не будут наблюдаться в локации или требованиях к миссии, но они будут наблюдаться в количестве приближающихся врагов и областях их появления, изменениях климата и различных препятствиях, которые встречаются между ними. Это делает игру более захватывающей и интересной.
В противном случае, после нескольких попыток игра покажется скучной, так как вы сможете предсказать события, которые произойдут дальше. Это может показаться простым, но для компьютера – генерировать случайные числа – это сложная задача, требующая следовать точным инструкциям, закодированным в нём.
Истинный ГСЧ против псевдо ГСЧ
Есть два типа генераторов случайных чисел: .
- Алгоритм истинного генератора случайных чисел создаётся с помощью аппаратного устройства, которое использует очень крошечные физические процессы для генерации случайных чисел. Так как алгоритм не написан; следовательно, истинный ГСЧ не может быть взломан для предсказания. Он обычно используется в системах, ориентированных на безопасность, по всему миру и в некоторых формах шифрования.
- Алгоритм генератора псевдослучайных чисел используется в областях, где нет проблем с безопасностью, а случайность используется, чтобы избежать повторений и сделать что-то более интересное для конечного пользователя. Реализовать технологию дешевле и быстрее, поскольку она не требует оборудования и может быть легко встроена в программный код. Хотя этот процесс не является полностью случайным и определяется на основе алгоритма, он больше подходит для игр и программ.
Какие приложения используют ГСЧ
Не во всех играх используется генератор случайных чисел, что делает их менее конкурентоспособными и часто утомительными, однако, новые игры почти всегда идут с генератором случайных чисел. Многие приложения и игры выигрывают от случайности, поскольку они могут приносить интерес и прибыль только в том случае, если они случайны:
- Азартные игры: бинго, карточные игры, лотереи и подобные игры.
- Игры со сбором добычи: все игры, требующие от игроков сбора добычи для использования в игровом процессе, например, PubG, Diablo и Borderlands используют ГСЧ. Возможность получать лучшую добычу каждый раз – вот причина, по которой люди становятся зависимыми от них.
- Приключенческие игры: такие игры, как Марио и Покемон Го используйте алгоритм генератора случайных чисел, чтобы определить, какие предметы будут добавлены, и каждый раз вы встречайтесь с новым претендентом на покемона.
- Процедурно-сгенерированные игры: все игры, в которых нет предварительно разработанных карт и уровней, но которые были разработаны в игре с использованием процедурного программирования, таких как Minecraft и Civilization. Это помогает создать всю игру с использованием алгоритма.
- Соревновательные игры: некоторые соревновательные игры, например, Counter-Strike используйте алгоритм генератора случайных чисел, чтобы регулировать, как пули поражают цели.
Помимо игровых приложений, есть код случайных чисел в JavaScript, используемый разработчиками и кодировщиками во всём мире для включения генератора случайных чисел в их программы. У Google есть свой очень интересный инструмент, который также основан на теории случайных чисел JavaScript и может генерировать случайные числа. Этот инструмент может пригодиться, когда вы играете в игры с друзьями и семьей. Чтобы посмотреть ГСЧ Google, нажмите здесь.
Манипуляции с ГСЧ
Я уже обсуждал различия между истинным ГСЧ и псевдо ГСЧ и тот факт, что в играх используется псевдо ГСЧ, основанный на алгоритме. Некоторые увлеченные геймеры используют утилиты эмуляции для анализа игр и выявления лазеек, которые можно использовать для управления результатами, даже если используется алгоритм генератора случайных чисел.
ГСЧ на основе алгоритма использует начальное число, которое представляет собой комбинацию определенных факторов и генерирует результат в игре. Это применяемые законы математики, и поскольку 1+1 всегда равно 2, аналогично, если известны факторы в игре, которые приносят желаемый результат, то вы всегда можете достичь того же результата.
Например, если игра требует от игрока выбрать определенного персонажа с определенными усилениями, и результатом будет легкая битва с боссом, то этот шаблон будет постоянным, и все, кто выберет одни и те же варианты, будут иметь одинаковые результаты. Но, для обычного игрока это было бы невозможно, и псевдо-ГСЧ всегда казался бы истинным ГСЧ.
Почему геймеры ненавидят ГСЧ
Геймеров можно разделить на соревнующихся игроков, спидраннеров и средних игроков. Любой конкурентоспособный игрок, овладевший техникой игры и движениями, захочет бросить вызов другим игрокам и побеждать на основе навыков и, несомненно, возненавидит игру, если на результат повлияет генератор случайных чисел. Точно так же спидраннер хотел бы завершить игру как можно скорее, но алгоритм генератора случайных чисел включает тормоза, создавая каждый раз неизвестные и неожиданные сценарии в игре.
В идеале геймеры хотели бы уменьшить количество случаев, когда они сталкиваются со средством генерации случайных чисел в игре, чтобы держать весь игровой процесс и результат под своим контролем. Но, это возможно лишь до определенной степени. И когда геймер часами осваивает игрового персонажа и его движения, он больше всего расстраивается, когда случается что-то случайное, и вся стратегия нарушается. Иногда это тоже действует как благословение, но обычно это проклятие.
Кто такой RNGesus?
Обычные игроки, которые играют только для того, чтобы развлечься или скоротать время, не заботятся о результате игры. Но, опытные профессиональные игроки ненавидят проигрывать только потому, что удача была не в их пользу.
Игроки, которые проигрывают, часто винят в своих поражениях злой ГСЧ, который выгоден их противникам. Там где зло, должен быть Бог – RNGesus.
Среди геймеров во всем мире появился новый термин, RNGesus, который больше соответствует игре слов с «Иисусом». Поскольку Иисус Христос считается нашим спасителем в реальном мире, RNGesus – это вообразимая сущность, созданная для спасения игроков от пагубных последствий ГСЧ. Это нигде не доказывается, но началось как миф, а теперь распространилось по игровому сообществу, как лесной пожар.
Окончательный вердикт по ГСЧ – хорошо или плохо?
На этот вопрос сложно ответить, и определенно не может быть одного и того же ответа для всех. В то время как среднестатистические геймеры утверждают, что это хорошо, другим нравится соревновательный дух.
Алгоритм генератора случайных чисел действительно сохраняет непредсказуемость и интересность каждый раз, когда вы играете на одном уровне. Он стал важной частью многих игр, предлагая разнообразие, например, головоломки, карточные игры, ролевые игры и многие другие. Но, для геймеров, которые верят в навыки как в единственный способ пройти игру, ГСЧ подрывает их потенциал, когда вытаскивает что-то случайное из коробки.
Игры предназначены для развлечения и удовольствия. Если у вас хороший ГСЧ, вы сможете получить лучшие варианты, несмотря на низкие шансы. В случае плохого ГСЧ, вы получите худший результат, даже если вы играли в игру именно так, как должно. Правда в том, что это не то, что можно воспринимать так серьёзно, особенно если оно основано на алгоритме генератора случайных чисел.
Случайные числа не случайны
FullStack CTO
More posts by FullStack CTO.
FullStack CTO
Как создать генератор случайных чисел на JS и предсказать Math.random()
Вы когда-нибудь задумывались, как работает Math.random()? Что такое случайное число и как оно получается? А представьте вопрос на собеседовании — напишите свой генератор случайных чисел в пару строк кода. И так, что же это такое, случайность и возможно ли ее предсказать.
Генератор псевдослучайных чисел и генератор случайных чисел
Для того, чтобы получить что-то случайное, нам нужен источник энтропии, источник некого хаоса из который мы будем использовать для генерации случайности.
Этот источник используется для накопления энтропии с последующим получением из неё начального значения (initial value, seed), которое необходимо генераторам случайных чисел (ГСЧ) для формирования случайных чисел.
Генератор ПсевдоСлучайных Чисел использует единственное начальное значение, откуда и следует его псевдослучайность, в то время как Генератор Случайных Чисел всегда формирует случайное число, имея в начале высококачественную случайную величину, которая берется из различных источников энтропии.
Энтропия — это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации.
Выходит, что чтобы создать псевдослучайную последовательность нам нужен алгоритм, который будет генерить некоторую последовательность на основании определенной формулы. Но такую последовательность можно будет предсказать. Тем не менее, давайте пофантазируем, как бы могли написать свой генератор случайных чисел, если бы у нас не было Math.random()
ГПСЧ имеет некоторый алгоритм, который можно воспроизвести.
ГСЧ — это получение чисел полностью из какого либо шума, возможность просчитать который стремится к нулю. При этом в ГСЧ есть определенные алгоритмы для выравнивания распределения.
Придумываем алгоритм ГПСЧ
Генератор псевдослучайных чисел (ГПСЧ, англ. pseudorandom number generator, PRNG) — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению (обычно равномерному).
Мы можем взять последовательность каких-то чисел и брать от них модуль числа. Самый простой пример, который приходит в голову. Нам нужно подумать, какую последовательность взять и модуль от чего. Если просто в лоб от 0 до N и модуль 2, то получится генератор 1 и 0:
Эта функция генерит нам последовательность 01010101010101… и назвать ее даже псевдослучайной никак нельзя. Чтобы генератор был случайным, он должен проходить тест на следующий бит. Но у нас не стоит такой задачи. Тем не менее даже без всяких тестов мы можем предсказать следующую последовательность, значит такой алгоритм в лоб не подходит, но мы в нужном направлении.
А что если взять какую-то известную, но нелинейную последовательность, например число PI. А в качестве значения для модуля будем брать не 2, а что-то другое. Можно даже подумать на тему меняющегося значения модуля. Последовательность цифр в числе Pi считается случайной. Генератор может работать, используя числа Пи, начиная с какой-то неизвестной точки. Пример такого алгоритма, с последовательностью на базе PI и с изменяемым модулем:
Но в JS число PI можно вывести только до 48 знака и не более. Поэтому предсказать такую последовательность все так же легко и каждый запуск такого генератора будет выдавать всегда одни и те же числа. Но наш генератор уже стал показывать числа от 0 до 9. Кстати, так выглядит распределение по выпадению чисел при 10000 итерациях:
Распределение очень неравномерное, но мы получим генератор чисел от 0 до 9.
Мы можем взять не число Pi, а время в числовом представлении и это число рассматривать как последовательность цифр, причем для того, чтобы каждый раз последовательность не повторялась, мы будем считывать ее с конца. Итого наш алгоритм нашего ГПСЧ будет выглядеть так:
Вот это уже похоже на генератор псевдослучайных чисел. И тот же Math.random() — это ГПСЧ, про него мы поговорим чуть позже. При этом у нас каждый раз первое число получается разным.
Собственно на этих простых примерах можно понять как работают более сложные генераторы случайных числе. И есть даже готовые алгоритмы. Для примера разберем один из них — это Линейный конгруэнтный ГПСЧ(LCPRNG).
Линейный конгруэнтный ГПСЧ
Линейный конгруэнтный ГПСЧ(LCPRNG) — это распространённый метод для генерации псевдослучайных чисел. Он не обладает криптографической стойкостью. Этот метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой следующей формулой:
где a(multiplier), c(addend), m(mask) — некоторые целочисленные коэффициенты. Получаемая последовательность зависит от выбора стартового числа — т.е. seed. При разных значениях seed получаются различные последовательности случайных чисел. Пример реализации такого алгоритма на JavaScript:
Многие языки программирования используют LСPRNG (но не именно такой алгоритм(!)).
Как говорилось выше, такую последовательность можно предсказать. Так зачем нам ГПСЧ? Если говорить про безопасность, то ГПСЧ — это проблема. Если говорить про другие задачи, то эти свойства — могут сыграть в плюс. Например для различных спец эффектов и анимаций графики может понадобиться частый вызов random. И вот тут важны распределение значений и перформанс! Секурные алгоритмы не могут похвастать скоростью работы.
Еще одно свойство — воспроизводимость. Некоторые реализации позволяют задать seed, и это очень полезно, если последовательность должна повторяться. Воспроизведение нужно в тестах, например. И еще много других вещей существует, для которых не нужен безопасный ГСЧ.
Как устроен Math.random()
Метод возвращает псевдослучайное число с плавающей запятой из диапазона , то есть, от 0 (включительно) до 1 (но не включая 1), которое затем можно отмасштабировать до нужного диапазона. Реализация сама выбирает начальное зерно для алгоритма генерации случайных чисел; оно не может быть выбрано или сброшено пользователем.
Как устроен алгоритм Math.random() — интересный вопрос. До недавнего времени, а именно до 49 Chrome использовался алгоритм MWC1616:
Именно этот алгоритм генерит нам последовательность псевдослучайных чисел в промежутке между 0 и 1.
UPD
Исправил ошибку в алгоритме MWC1616 (пропущенные скобки). Эта же ошибка повторяется и в статье https://v8project.blogspot.ru/2015/12/theres-mathrandom-and-then-theres.html
то видим, что должны быть скобки:
Предсказываем Math.random()
Чем это было чревато? Есть такой квест: https://alf.nu/ReturnTrue
В нем есть задача:
Что нужно вписать вместо вопросов, чтобы функция вернула true? Кажется что это невозможно. Но, это возможно, если вы заглядывали в спеку и видели алгоритм ГПСЧ V8. Решение этой задачи в свое время мне показал Роман Дворнов:
Этот код работал в 70% случаев для Chrome
Видите эти равномерности на левом слайде? Изображение показывает проблему с распределением значений. На картинке слева видно, что значения местами сильно группируются, а местами выпадают большие фрагменты. Как следствие — числа можно предсказать.
Выходит что мы можем отреверсить Math.random() и предсказать, какое было загадано число на основе того, что получили в данный момент времени. Для этого получаем два значения через Math.random(). Затем вычисляем внутреннее состояние по этим значениям. Имея внутреннее состояние можем предсказывать следующие значения Math.random() при этом не меняя внутреннее состояние. Меняем код так так, чтобы вместо следующего возвращалось предыдущее значение. Собственно все это и описано в коде-решении для задачи random4. Но потом алгоритм изменили (подробности читайте в спеке). Его можно будет сломать, как только у нас в JS появится нормальная работа с 64 битными числами. Но это уже будет другая история.
Новый алгоритм выглядит так:
Его все так же можно будет просчитать и предсказать. Но пока у нас нет “длинной математики” в JS. Можно попробовать через TypedArray сделать или использовать специальные библиотеки. Возможно кто-то однажды снова напишет предсказатель. Возможно это будешь ты, читатель. Кто знает ?
Сrypto Random Values
Метод Math.random() не предоставляет криптографически стойкие случайные числа. Не используйте его ни для чего, связанного с безопасностью. Вместо него используйте Web Crypto API (API криптографии в вебе) и более точный метод window.crypto.getRandomValues() .
Пример генерации случайного числа:
Но, в отличие от ГПСЧ Math.random(), этот метод очень ресурсоемкий. Дело в том, что данный генератор использует системные вызовы в ОС, чтобы получить доступ к источникам энтропии (мак адрес, цпу, температуре, etc…).
Материалы про Math.random()
Больше про random в спецификации:
Хорошая статья про работу рандомайзера
Пример реализации предсказателя с Math.random()
Кстати, следить за обновлениями и прочими материалами от меня можно в телеграм канале: @prowebit
В этом канале публикую не только статьи из этого блога, но и различные новости и мысли. Подписывайтесь ?
Генератор случайных чисел онлайн для конкурса, розыгрыша, лотереи бесплатно | Рандомайзер
Автор: Юрий Белоусов · 18.08.2019
Онлайн генератор случайных чисел – это незаменимый бесплатный инструмент для людей, которые проводят конкурсы и розыгрыши, ведь он позволяет честно, без предвзятости выбрать число случайным образом и на основе его — победителя. Он часто используется для проведения конкурсов в Вконтакте (ВК), Одноклассниках, Инстаграм, Facebook.
Также, генератор рандомных чисел используют люди, участвующие в лотереях, тотализаторах, рулетках. К слову, у большинства крупных лотерей, вроде Столото, Русское лото и прочих, уже есть встроенный генератор, адаптированный к конкретной лотерее. Но у многих участников возникают сомнения по поводу их объективности, поэтому предпочтение отдается сторонним онлайн-сервисам, разработчики которых не заинтересованы в подтасовке результатов.
В этой статье мы рассмотрим несколько лучших бесплатных онлайн генераторов случайных чисел, которые идеально подойдут для проведения конкурсов, розыгрышей, а также для участия в лотереи.
Но если вы относитесь к тем, кто тратит свои деньги на покупку лотерейных билетов, то вам просто необходимо прислушаться к совету из этого видео:
В лотерею побеждает только владелец лотереи!
Онлайн-сервисы генерации случайных чисел
Далее рассмотрим самые популярные онлайн сервисы для генерации случайных чисел, а также, в конце статьи, программу-генератор случайных чисел для компьютера и приложения для телефона.
Онлайн генератор случайных чисел Randstuff
Randstuff – простой онлайн генератор случайных чисел и имеет в своем функционале базовые возможности генерации чисел. Он универсальный и подойдет для большинства поставленных задач.
Возможности онлайн генератор случайных чисел Randstuff:
- Генерация одного числа: двухзначного, трехзначного, четырехзначного, и любых других больших чисел, вплоть до 999999999;
- Генерация из последовательности нескольких определенных чисел;
- Точная генерация чисел из заданного диапазона;
- Генерация выбранных чисел из заданного списка;
- Исключение повторений при генерации случайных чисел;
- Сохранение результата и получение ссылки на сгенерированное число с указанием даты и времени генерации.
По умолчанию генератор случайных чисел стоит в диапазоне от 1 до 100, но пользователь может самостоятельно выбрать определенный нужный интервал, например, сделать от 1 до 10 или от 1 до 1000000.
Чтобы получить новые случайны числа, достаточно повторно нажать на кнопку «Сгенерировать».
Рандомайзер случайных чисел онлайн на русском Castlots
Castlots – еще один простой рандомайзер случайных чисел на русском языке.
Возможности и функции:
- Генерация множества чисел;
- Выбор диапазона;
- Функция без повторений, позволяющая рандомизировать только уникальные числа;
- Указание даты и времени при выполнении генерации случайного числа;
- Указание количество попыток генерации;
- Предоставление ссылки на результаты.
Диапазон чисел по умолчанию – от 1 до 100, но его можно изменить по необходимости.
Рандомайзер случайных чисел
Генераторов случайных чисел очень много и все они схожи по своему функционалу и имеют все те же возможности: выбор диапазона из большого списка чисел, функция без повторов и т.д., поэтому детально описывать стану, выложу лишь списком ссылки на сайты онлайн-сервисов.
Рандомайзеры случайных чисел:
- случайноечисло.рф
- calculator888.ru (данный генератор может упорядочить числа и сделать выборку по возрастанию или убыванию)
- randomus.ru (с функцией сортировки по порядку)
- generator-online.com
- gsgen.ru
Генератор случайных чисел для лотереи онлайн бесплатно
В сети интернет можно также найти множество сайтов с уже готовыми генераторами случайных чисел для лотереи онлайн, в которых пользователю нет необходимости даже делать какие-либо настройки и задавать параметры. Достаточно просто нажать на одну кнопку и заветные счастливые цифры выведутся на экран.
Генератор случайных чисел для лотереи (ГСЧ) Gsgen
Gsgen – очень удобный, красивый и главное — бесплатный онлайн генератор случайных чисел для лотереи, в котором можно сгенерировать числа для билетов лотерей Гослото и Спортлото:
- 5 из 36
- 6 из 45
- 4 из 20
- 12 из 24
- 6 из 36
- 7 из 49
- 6 из 49
При формировании результатов используется алгоритм генератора псевдослучайных чисел, с помощью данного принципа работы распределение цифр происходит равномерно.
Использование стороннего независимого сервиса позволяет исключить из формирования числовой последовательности субъективность как со стороны пользователя, у которого могут быть какие-то предпочтения при выборе цифр, так и субъективность генераторов на официальных сайтах лотерей.
Генератор случайных чисел для Лото Randomorg
Генератор случайных чисел для Лото Randomorg включает в себя следующие лотереи:
- 4 из 20
- 5 из 36
- 6 из 45
- 6 из 49
- 7 из 49
- 12 из 24
- Рапидо
- Кено
- Топ 3
- Дуэль
Пользоваться им просто – достаточно нажать на кнопку соответствующей лотереи и нужный набор случайных чисел отобразиться на странице.
Онлайн генератор чисел для лотерей — 5 из 36, 6 из 45, 6 из 49, 7 из 49 — soft-arhiv
soft-arhiv – удобный генератор чисел для лотереи, который позволит сформировать сразу несколько комбинаций чисел в билетах для участия в нескольких тиражах. При этом есть возможность исключить заданные числа. Например, если есть какое-нибудь невезучее число, которое не хотелось бы видеть в списке, то достаточно просто указать его в соответствующем поле.
Генераторы чисел для лотереи на официальном сайте Stoloto
Stoloto – конечно же, при использовании генераторов на официальном сайте Столото, могут появиться сомнения на счет объективности формирования чисел. Однако, сомнения напрасны. Подобные лотереи не обманывают, так как в этом нет никакого смысла. Например, расчётная возвратность денежных средств в лотерее 5 из 36 составляет 34,7%, что означает, что если вложить 1 000 000 рублей, то выигрыш составит 347 000. А остальные 653 000 уйдут на формирование джекпота и в карман владельцу лотереи.
Поэтому генераторы не помогут угадать случайные выигрышные числа и никак не сделают шанс на выигрыш больше. Система просто не позволит этого сделать!
Программа генератор случайных чисел: скачать софт для выбора случайного числа
Помимо онлайн сервисов, есть также специализированные программы-генераторы случайных чисел, способны легко выбрать число на основе рандома.
Программа для компьютера имеет значительно больше функций, так как способна генерировать не только целые натуральные числа, но и дробные, десятичные числа.
К сожалению, интерфейс не на русском, доступна лишь английская версия. Тем не менее, функционал очень простой и интуитивно понятный, поэтому использование программы не составит труда.
Программа бесплатная и подходит для следующих ОС: Windows 10, 8.1, 8, 7, Vista, XP.
Приложение генератор случайных чисел для Андроид
Приложения генераторы случайных чисел для Андроид телефона или планшета:
Надеюсь, вам была полезна статья о генераторах случайного ряда чисел, а также рандомайзерах для игры в лотереях и вам больше не придется искать информацию в Яндексе и Google.
Не нашли ответ? Тогда воспользуйтесь формой поиска:
Готовимся к собеседованию: случайные числа в Python
Случайность управляет миром, а вы будете управлять случайностью. С помощью Python, конечно.
Чтобы имитировать бросок кубика в игре или предсказать загруженность интернет-ресурса, нужны случайные числа.
Мы разобрали самые популярные вопросы о случайных числах в Python с собеседований. Чаще всего для ответа достаточно написать код и кратко его прокомментировать. Да пребудет с вами Великий Рандом!
Главное, что нужно помнить
- Случайные числа — это последовательность чисел, которая подчиняется одному из законов распределения.
- Главных распределений два: равномерное, с графиком в виде горизонтальной линии, и нормальное, с графиком-колоколом (его ещё называют гауссианой).
- Основная Python-библиотека для генерации случайных чисел называется random.
- Большинство случайных чисел в программировании — не случайные, а псевдослучайные.
С некоторых пор утверждает, что он data scientist. В предыдущих сезонах выдавал себя за математика, звукорежиссёра, радиоведущего, переводчика, писателя. Кандидат наук, но не точных. Бесстрашно пишет о Data Science и программировании на Python.
Вопрос 1. Что такое случайные числа?
Что нужно помнить: случайные числа — это математическое понятие, и их не следует путать с обыденными, произвольными числами. Случайное число в математике и программировании — это:
- число из определённого диапазона,
- у которого есть определённая вероятность выпадения.
Другими словами, существует закон или правило, которое называется «функцией распределения» или просто «распределением». И это самое распределение «раздаёт» каждому числу из диапазона определённую вероятность выпадения.
В качестве диапазона значений математикам и программистам привычнее всего использовать диапазон действительных чисел от 0 до 1, но это могут быть и целые числа от 1 до 6, как в игральном кубике, или от 100 до 1 000 000 — и так далее. Главное, что и распределение, и диапазон известны заранее, а само число нет.
Итого: случайные числа — это искусственно полученная последовательность чисел из определённого диапазона, которая подчиняется одному из законов распределения случайной величины.
Распределения бывают разные. Так, равномерное распределение — это когда любое значение из диапазона имеет одну и ту же вероятность выпадения (как у игрального кубика или монетки). Если же распределение, например, нормальное (гауссиана), то чаще выпадают числа из середины диапазона. Есть даже таблица — она поможет выбрать подходящее распределение.
Вопрос 2. Как получить случайные числа в Python?
Основных способов два: с помощью «родной» библиотеки random и с помощью модуля numpy.random из библиотеки numpy.
Прежде чем интервьюер придерётся, не забудьте сказать, что и random, и numpy.random — генераторы псевдослучайных чисел (о них ниже). Истинно случайные числа можно получить, например, c сайта Random.Org: там они генерируются с помощью атмосферного шума.
Библиотека random имеет меньший объём, чем numpy.random, и проще в использовании. Зато numpy.random содержит дополнительные распределения для научных вычислений, а также функции для генерирования целых массивов случайных данных.
В первой строчке мы импортировали default_rng — это «генератор генераторов» случайных массивов из модуля numpy.random. Во второй — создали экземпляр такого генератора и присвоили ему имя rng. В третьей использовали его метод standard_normal, чтобы получить numpy-массив из 10 случайных чисел, и записали массив в переменную vals.
Вопрос 3. Псевдослучайные числа
Псевдослучайные числа — это, если очень упрощать, последовательность чисел, которая только выглядит случайной, а на самом деле каждое число в ней определяется алгоритмом, то есть вычисляется. Псевдослучайные последовательности цикличны: через какой-то период все числа повторяются в точности в том же порядке.
Библиотека random и модуль numpy.random содержат в себе генератор не истинно случайных, а именно псевдослучайных чисел.
Генерировать истинно случайные числа дорого и сложно. Основная трудность состоит в том, чтобы гарантировать отсутствие какого-либо цикла, правила или алгоритма. Чаще всего истинно случайные числа берут из физического мира: шумов атмосферы, детекторов частиц, колебаний электрического тока или из космического излучения.
То, что псевдослучайная последовательность, в отличие от истинно случайной, воспроизводима, очень удобно для практических задач: часто нужно подать на вход ту же самую последовательность второй раз, чтобы посмотреть, как работает программа после добавления новых фич.
Наиболее популярный современный алгоритм генерирования псевдослучайных чисел разработан в 1997 году и носит красивое название «Вихрь Мерсенна». Он используется и в Python. Последовательность чисел, порождённая им, статистически неотличима от истинно случайной и имеет период, равный числу с шестью тысячами знаков. Этого хватает для задач симуляции и моделирования, но с точки зрения криптографии такая последовательность всё равно небезопасна: для успешной атаки достаточно иметь сравнительно небольшую сгенерированную этим генератором последовательность.
Вопрос 4. Как повторить случайную последовательность?
Истинно случайную последовательность повторить невозможно. Но для повторения псевдослучайных чисел в обеих основных библиотеках — random и numpy.random есть функция seed (), которая отвечает за инициализацию («посев») последовательности.
Передавая аргумент 42 в функцию seed(), мы указываем конкретное место в псевдослучайной последовательности, поэтому команда random.random() в третьей и последней строках выдаёт одинаковое число — оно идёт первым после точки, помеченной как seed (42).
В seed() можно передать целые и дробные числа, а также строки и кортежи. Если оставить скобки пустыми, то в качестве аргумента seed() возьмёт текущее системное время.
Аналогичная функция есть в модуле numpy.random:
Вопрос 5. Красные и зелёные шары
Часто на собеседованиях просят написать программу, связанную с вероятностями. Например, код для численной проверки ответа к задачке «Какова вероятность вытащить зелёный шар из мешка, в котором 1 зелёный и 4 красных шара».
(Ответ ⅕ = 0,2).
Иными словами, если 100 раз вынимать шар из мешка, возвращая его обратно, количество выпадения зелёных шаров должно приближаться к 20. Вариант кода для проверки:
Функция random.choice() случайным образом выбирает значение из заданного диапазона — списка из одного « green» и четырёх « red». Код выведет количество зелёных шаров после 100 попыток.
Вопрос 6. Нечестная монетка
Другой вариант: предположим, у нас есть так называемая «нечестная» монетка, где орёл ( H, «heads») и решка ( T, «tails») выпадают не с вероятностью ½, как положено, а по-другому: орёл с вероятностью p(H) = 0,2, а решка, соответственно, p(T) = 0,8.
Тогда код для проверки будет выглядеть примерно так:
Здесь используется другая функция, choices, в которую вместе со списком значений можно в параметре weights передавать вероятности их выпадения.
Код выведет количество выпавших орлов после 10 000 бросков.
К слову: задачи на нечестные монетки, наряду с поиском n-ного числа Фибоначчи и нахождением угла между часовой и минутной стрелками, кочуют из одного собеседования в другое уже не первый десяток лет. Есть вероятность, что одна из них попадётся и вам.
Вопрос 7. Проиллюстрируйте закон больших чисел
Закон больших чисел (ЗБЧ) говорит, что при увеличении количества попыток случайная величина стремится к своему математическому ожиданию — всё усредняется. Подробнее об этом можно прочитать в нашей статье об основах математики для Data Science.
Код для иллюстрации ЗБЧ на примере честной монетки выглядит так:
Вначале мы импортировали уже знакомый нам модуль random и модуль matplotlib.plt — он нужен для рисования простых графиков. После этого определили переменные: общее количество бросков ( total_flips), список из значений вероятностей ( numerical_probability), количество выпавших орлов ( H_count).
Теперь в цикле мы 5 000 раз «подбрасываем» монетку. Если выпадает орёл (« H»), то делим текущее количество выпавших орлов на текущее количество бросков и добавляем итоговое значение в конец списка numerical_probability. В конце рисуем график.
Чем больше бросков, тем ближе к 0,5 вероятность выпадения орла. Всё, как и предсказывает закон больших чисел.
Вопрос 8. Где применяются случайные числа?
В логистике: при расчётах страховых запасов товара — чтобы склад внезапно не опустел или, наоборот, не пришлось держать избыток товара слишком долго. Принято считать, что поведение покупателей случайно и подчиняется одной из разновидностей нормального распределения. В особо запущенных случаях считается случайным даже поведение поставщиков.
В науке: с помощью метода Монте-Карло учёные моделируют поведение частиц во фрактальном окружении в трёхмерном пространстве. Метод Монте-Карло основан на использовании большого количества генерируемых случайных чисел.
В микроэлектронике: броуновское движение частиц играет важную роль в формировании пористости плёночного покрытия полупроводников при напылении его на поверхность. Просчитать это на компьютере гораздо дешевле, чем экспериментировать с реальным покрытием, поэтому сначала его рассчитывают, а потом запускают в производство.
В криптографии: для генерации шифровальных ключей. Здесь становится особенно важным различие между псевдослучайными и истинно случайными числами.
Случайности не случайны
Так говорил мастер Угвэй , и мы теперь понимаем его чуть лучше: он жил довольно долго, мог заметить период повторения одних и тех же событий и догадаться, что все случайности в этом мире на самом деле псевдослучайны. У нас с вами времени меньше, поэтому придётся изучать документацию: random, numpy.random.
А чтобы никакая псевдослучайность не помешала вам успешно пройти собеседование, приходите в наш Шаолинь на курс «Профессия Python-разработчик». Вы изучите random, numpy и ещё много приёмов пайтонического кунг-фу, а мы поможем с наставниками, единомышленниками и, конечно, с трудоустройством.
Источник: