Домой Регистрация
Приветствуем вас, Гость



Форма входа

Население


Вступайте в нашу группу Вконтакте! :)




ПОИСК


Опросник
Используете ли вы афоризмы и цитаты в своей речи?
Проголосовало 514 человек


Генератор случайных чисел это что такое


Как написать генератор случайных чисел и можно ли предсказать Math.random?

Вы когда-нибудь задумывались, как работает Math.random()? Что такое случайное число и как оно получается? А представьте вопрос на собеседовании — напишите свой генератор случайных чисел в пару строк кода. И так, что же это такое, случайность и возможно ли ее предсказать?

Меня очень увлекают различные IT головоломки и задачки и генератор случайных чисел — одна из таких задачек. Обычно в своем телеграм канале я разбираю всякие головоломки и разные задачи с собеседований. Задача про генератор случайных чисел набрала большую популярность и мне захотелось увековечить ее в недрах одного из авторитетных источников информации — то бишь здесь, на Хабре.

Данный материал будет полезен всем тем фронтендерам и Node.js разработчикам, кто на острие технологий и хочет попасть в блокчейн проект/стартап, где вопросы про безопасность и криптографию, хотя бы на базовом уровне, спрашивают даже у фронтендеров.

Генератор псевдослучайных чисел и генератор случайных чисел

Для того, чтобы получить что-то случайное, нам нужен источник энтропии, источник некого хаоса из который мы будем использовать для генерации случайности. Этот источник используется для накопления энтропии с последующим получением из неё начального значения (initial value, seed), которое необходимо генераторам случайных чисел (ГСЧ) для формирования случайных чисел. Генератор ПсевдоСлучайных Чисел использует единственное начальное значение, откуда и следует его псевдослучайность, в то время как Генератор Случайных Чисел всегда формирует случайное число, имея в начале высококачественную случайную величину, которая берется из различных источников энтропии.Энтропия — это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации. Выходит, что чтобы создать псевдослучайную последовательность нам нужен алгоритм, который будет генерить некоторую последовательность на основании определенной формулы. Но такую последовательность можно будет предсказать. Тем не менее, давайте пофантазируем, как бы могли написать свой генератор случайных чисел, если бы у нас не было Math.random() ГПСЧ имеет некоторый алгоритм, который можно воспроизвести. ГСЧ — это получение чисел полностью из какого либо шума, возможность просчитать который стремится к нулю. При этом в ГСЧ есть определенные алгоритмы для выравнивания распределения.

Придумываем свой алгоритм ГПСЧ

Генератор псевдослучайных чисел (ГПСЧ, англ. pseudorandom number generator, PRNG) — алгоритм, порождающий последовательность чисел, элементы которой почти независимы друг от друга и подчиняются заданному распределению (обычно равномерному). Мы можем взять последовательность каких-то чисел и брать от них модуль числа. Самый простой пример, который приходит в голову. Нам нужно подумать, какую последовательность взять и модуль от чего. Если просто в лоб от 0 до N и модуль 2, то получится генератор 1 и 0: function* rand() { const n = 100; const mod = 2; let i = 0; while (true) { yield i % mod; if (i++ > n) i = 0; } } let i = 0; for (let x of rand()) { if (i++ > 100) break; console.log(x); } Эта функция генерит нам последовательность 01010101010101… и назвать ее даже псевдослучайной никак нельзя. Чтобы генератор был случайным, он должен проходить тест на следующий бит. Но у нас не стоит такой задачи. Тем не менее даже без всяких тестов мы можем предсказать следующую последовательность, значит такой алгоритм в лоб не подходит, но мы в нужном направлении. А что если взять какую-то известную, но нелинейную последовательность, например число PI. А в качестве значения для модуля будем брать не 2, а что-то другое. Можно даже подумать на тему меняющегося значения модуля. Последовательность цифр в числе Pi считается случайной. Генератор может работать, используя числа Пи, начиная с какой-то неизвестной точки. Пример такого алгоритма, с последовательностью на базе PI и с изменяемым модулем: const vector = [...Math.PI.toFixed(48).replace('.','')]; function* rand() { for (let i=3; i 99) i = 2; for (let n=0; n [...(+new Date)+''].reverse(); let vector = newNumVector(); let i=2; while (true) { if (i++ > 99) i = 2; let n=-1; while (++n < vector.length) yield (vector[n] % i); vector = newNumVector(); } } // TEST: let i = 0; for (let x of rand()) { if (i++ > 100) break; console.log(x) } Вот это уже похоже на генератор псевдослучайных чисел. И тот же Math.random() — это ГПСЧ, про него мы поговорим чуть позже. При этом у нас каждый раз первое число получается разным.

Собственно на этих простых примерах можно понять как работают более сложные генераторы случайных числе. И есть даже готовые алгоритмы. Для примера разберем один из них — это Линейный конгруэнтный ГПСЧ(LCPRNG).

Линейный конгруэнтный ГПСЧ

Линейный конгруэнтный ГПСЧ(LCPRNG) — это распространённый метод для генерации псевдослучайных чисел. Он не обладает криптографической стойкостью. Этот метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой формулой. Получаемая последовательность зависит от выбора стартового числа — т.е. seed. При разных значениях seed получаются различные последовательности случайных чисел. Пример реализации такого алгоритма на JavaScript: const a = 45; const c = 21; const m = 67; var seed = 2; const rand = () => seed = (a * seed + c) % m; for(let i=0; i> 16); state1 = 30903 * (state1 & 0xffff) + (state1 >> 16); return (state0 >>Z)+k++)&F^h>>>Z;);for(k=0;F^k&&(d=I(B,g&F)+k++)&F^h&F;);for(k=2;k—;g=c

Генератор случайных чисел онлайн | Рандом чисел

Генератор чисел онлайн — это удобный инструмент, позволяющий получить необходимое количество чисел заданной разрядности и широчайшего диапазона. Нашему генератору случайных чисел можно найти множество применений! Например, можно провести конкурс в ВКонтакте и разыграть там плюшевого медведя в группе байкеров за рипост:)) Также мы будем весьма польщены, если с помощью него Вы решите определить выигрышный номер в какой-либо лотерее или же решите, на какое число ставить в казино. Очень надеемся, что кто-нибудь найдет свое счастливое число онлайн именно у нас!

Числа окружают нас с самого рождения и играют важную роль в жизни. У многих людей сама работа связана с числами, кто-то полагается на удачу, заполняя числами лотерейные билеты, а кто-то придает им и вовсе мистическое значение. Так или иначе, иногда нам не обойтись без того, чтобы воспользоваться такой программой, как генератор рандомных чисел.

К примеру, вам необходимо организовать розыгрыш призов среди подписчиков вашей группы. Быстро и честно выбрать призеров и поможет наш генератор случайных чисел онлайн. Вам просто нужно, например, задать нужное количество рандомных чисел (по числу призеров) и максимальный диапазон (по числу участников, если им присвоены номера). Подтасовка в таком случае полностью исключается.

Эта программа может также послужить как генератор случайных чисел для лото. К примеру, вы купили билет и хотите полностью полагаться на случайность и удачу в выборе чисел. Тогда наш рандомайзер чисел поможет заполнить ваш лотерейный билет.

Как сгенерировать случайное число: инструкция

Программа случайных чисел работает очень просто. Вам даже не нужно загружать ее на компьютер – все делается в окне браузера, где открыта эта страница. Генерация случайных чисел происходит в соответствии с заданным количеством чисел и их диапазоном – от 0 до 999999999. Чтобы сгенерировать число онлайн, необходимо:

  1. Выбрать диапазон, в котором вы хотите получить результат. Возможно, вы хотите отсечь числа до 10 или, скажем, 10000;
  2. Исключить повторения – выбрав этот пункт, вы заставите рандомизатор чисел предлагать вам только уникальные комбинации в рамках определенного диапазона;
  3. Выбрать количество чисел – от 1 до 99999;
  4. Нажать кнопку «Сгенерировать числа».

Сколько бы вы чисел не хотели получить в результате, генератор простых чисел выдаст весь результат сразу и вы сможете увидеть его на этой странице, листая поле с числами при помощи мышки или тачпада.

Теперь вы можете воспользоваться готовыми числами так, как вам это необходимо. Из поля с числами вы можете скопировать результат для публикации в группе или отправке по почте. А чтобы результат не вызывал ни у кого сомнений, сделайте скриншот этой страницы, на которой будут хорошо видны параметры рандомизатора чисел и результаты работы программы. Изменить числа в поле невозможно, поэтому возможность подтасовки исключается. Надеемся, вам помог наш сайт и генератор случайных чисел.

numbers

Что такое генератор случайных чисел?

Что бы получить случайное число генератор случайных чисел использует встроенные функции для получения нужного результата. И так, для создания случайного числа применяется функция rand, которая возвращения случайных значений, которые имеют диапазон от 0, и до установленной константы. В программной директиве #include «stdlib.h» определены: функция rand и заданная константа. Вот вызов: тип переменной z = начальное число + rand () % конечное число. Как это ни странно, при запуске приложения у нас постоянно возвращается тоже самое значение. Все взаимосвязано на системном времени, и функция rand сохраняет при компиляции строгое время, которым и управляет. Так как программное время одно и то же, генератор случайных чисел, точнее его алгоритм, летит к чертям.

Операторы srand и random

Оператор srand является незаменимым решением ситуации. Когда в коде приложения обращаются к оператору rand, srand успешно обнуляет системный таймер. Т. е. функция srand способствует алгоритму, встроенному в генератор случайных чисел, действовать правильно, и теперь все данные числа, возвращаемые функцией rand, будут являться случайными. Не так давно в языке программирования си ++ поднялся на уровень процесс появлений случайных значений, из-за ввода микросекунд. Это вытекло в функцию random, которая, кроме уточненной выдачи случайных значений, расширила диапазон решений. В последствие все представленные функции появились в web-языке программирования PHP, на котором создаётся подавляющее большинство сайтов.

Пример с пояснениями

#include «time.h»// системная директива работы со временем #include «stdlib.h»// хранятся функции для работы с генератором #include «stdio.h»// функции ввода/вывода

int main () // основная функции, в которой выполняется код {

srand (time (NULL)); // для получения различных случайных значений

int rand_chislo; // объявляем переменную for (int i = 0; i < 5 ;i++) // цикл на 5 проходов (итераций) {

rand_chislo = 2 + rand () %7; // случайное число будет от 2 и до 7

printf («%d «, rand_chislo); // вывод данного числа на экран }

return 0; // выход из основной функции

}

Итоги

Как вы наверняка поняли, данные числа не являются случайными. У нас, да и во всем мире их принято называть — псевдослучайными. Все современные игры и приложения используют механизм данных чисел для создания различных событий. Вы так же, прочитав данный материал, может смело приступать к практике программирования. Без нее, к сожалению, невозможно написать ни одну приличную программу. Но, Москва не сразу строилась, так же и Ваши знания должны потихоньку наполняться и закрепляться практической частью. Желаю Вам успехов в постижении сложного, но интересного мира программирования.

RandomOrg.Ru — онлайн генератор случайных чисел

и Apple Watch 5 от Wylsacom и LetyShops

Они случайно разбогатели, благодаря удочке!

Рецепт, который получился случайно

Случайность или закономерность?

Последние 100 сгенерированных

Генератор случайных чисел прекрасно подходит для проведения розыгрышей, конкурсов и определения победителей онлайн. Вы можете выбрать диапазон, из которого будет получен результат. Полученное число вы увидите под полями для ввода первоначальных данных.

Также его можно посмотреть на странице “Последние 100” нашего сайта рандом орг на русском, где отображаются последние генерации цифр с подробной информацией: дате и времени (по UTC — отличается от московского времени на 3 часа в меньшую сторону), диапазоне чисел от начального и конечного, и результат, который сгенерировал рандомайзер чисел онлайн.

Поле комментарий можно использовать для проверки результата, после того, как будет нажата кнопка “Сгенерировать число”. Так, например, при проведении конкурса можно указать в этом поле информацию о розыгрыше, благодаря чему участники конкурса также смогут зайти на страницу с последними генерациями и увидеть результат работы рандомайзера случайных чисел с этим комментарием и, таким образом, убедиться в честности проведения розыгрыша и добропорядочности организаторов.

Наш сайт рандоморг по-русски — это генератор случайных цифр и чисел, который выдает результат из выбранного вами диапазона. По умолчанию это от 0 до 100, но вы можете ввести нужные вам числа, а также свой комментарий, и нажать кнопку “Сгенерировать число онлайн”.

Попробуйте и другие наши сервисы

Узнай онлайн, на кого будет похожа твоя будущая жена

Узнай онлайн, на кого будет похож твой будущий муж

Тут можно создать рандомный текст

Лекция 22. Генераторы случайных чисел

Рис. 22.2. Частотная диаграмма выпадения случайных чисел,порождаемых реальным генератором

Заметим, что в идеале кривая плотности распределения случайных чисел выглядела бы так, как показано на рис. 22.3. То есть в идеальном случае в каждый интервал попадает одинаковое число точек: Ni = N/k, где N — общее число точек, k — количество интервалов, i = 1, …, k.

Рис. 22.3. Частотная диаграмма выпадения случайных чисел,порождаемых идеальным генератором теоретически

Следует помнить, что генерация произвольного случайного числа состоит из двух этапов:

Генераторы случайных чисел по способу получения чисел делятся на:

Физические ГСЧ

Примером физических ГСЧ могут служить: монета («орел» — 1, «решка» — 0); игральные кости; поделенный на секторы с цифрами барабан со стрелкой; аппаратурный генератор шума (ГШ), в качестве которого используют шумящее тепловое устройство, например, транзистор (рис. 22.4–22.5).

Рис. 22.4. Схема аппаратного метода генерации случайных чисел
Рис. 22.5. Диаграмма получения случайных чисел аппаратным методом
Задача «Генерация случайных чисел при помощи монеты»

Сгенерируйте случайное трехразрядное число, распределенное по равномерному закону в интервале от 0 до 1, с помощью монеты. Точность — три знака после запятой.

Первый способ решения задачи Подбросьте монету 9 раз, и если монета упала решкой, то запишите «0», если орлом, то «1». Итак, допустим, что в результате эксперимента получили случайную последовательность 100110100.

Начертите интервал от 0 до 1. Считывая числа в последовательности слева направо, разбивайте интервал пополам и выбирайте каждый раз одну из частей очередного интервала (если выпал 0, то левую, если выпала 1, то правую). Таким образом, можно добраться до любой точки интервала, сколь угодно точно.

Итак, 1: интервал [0; 1] делится пополам — [0; 0.5] и [0.5; 1], — выбирается правая половина, интервал сужается: [0.5; 1]. Следующее число, 0: интервал [0.5; 1] делится пополам — [0.5; 0.75] и [0.75; 1], — выбирается левая половина [0.5; 0.75], интервал сужается: [0.5; 0.75]. Следующее число, 0: интервал [0.5; 0.75] делится пополам — [0.5; 0.625] и [0.625; 0.75], — выбирается левая половина [0.5; 0.625], интервал сужается: [0.5; 0.625]. Следующее число, 1: интервал [0.5; 0.625] делится пополам — [0.5; 0.5625] и [0.5625; 0.625], — выбирается правая половина [0.5625; 0.6250], интервал сужается: [0.5625; 0.6250].

По условию точности задачи решение найдено: им является любое число из интервала [0.5625; 0.6250], например, 0.625.

В принципе, если подходить строго, то деление интервалов нужно продолжить до тех пор, пока левая и правая границы найденного интервала не СОВПАДУТ между собой с точностью до третьего знака после запятой. То есть с позиций точности сгенерированное число уже не будет отличимо от любого числа из интервала, в котором оно находится.

Второй способ решения задачи Разобьем полученную двоичную последовательность 100110100 на триады: 100, 110, 100. После перевода этих двоичных чисел в десятичные получаем: 4, 6, 4. Подставив спереди «0.», получим: 0.464. Таким методом могут получаться только числа от 0.000 до 0.777 (так как максимум, что можно «выжать» из трех двоичных разрядов — это 1112 = 78) — то есть, по сути, эти числа представлены в восьмеричной системе счисления. Для перевода восьмеричного числа в десятичное представление выполним: 0.4648 = 4 · 8–1 + 6 · 8–2 + 4 · 8–3 = 0.601562510 = 0.60210. Итак, искомое число равно: 0.602.

Табличные ГСЧ

Табличные ГСЧ в качестве источника случайных чисел используют специальным образом составленные таблицы, содержащие проверенные некоррелированные, то есть никак не зависящие друг от друга, цифры. В табл. 22.1 приведен небольшой фрагмент такой таблицы. Обходя таблицу слева направо сверху вниз, можно получать равномерно распределенные от 0 до 1 случайные числа с нужным числом знаков после запятой (в нашем примере мы используем для каждого числа по три знака). Так как цифры в таблице не зависят друг от друга, то таблицу можно обходить разными способами, например, сверху вниз, или справа налево, или, скажем, можно выбирать цифры, находящиеся на четных позициях.

Таблица 22.1.Случайные цифры. Равномерно

распределенные от 0 до 1 случайные числа

Случайные цифры Равномерно распределенныеот 0 до 1 случайные числа
9 2 9 2 0 4 2 6 0.929
9 5 7 3 4 9 0 3 0.204
5 9 1 6 6 5 7 6 0.269

Достоинство данного метода в том, что он дает действительно случайные числа, так как таблица содержит проверенные некоррелированные цифры. Недостатки метода: для хранения большого количества цифр требуется много памяти; большие трудности порождения и проверки такого рода таблиц, повторы при использовании таблицы уже не гарантируют случайности числовой последовательности, а значит, и надежности результата.

Здесь находится таблица, содержащая 500 абсолютно случайных проверенных чисел (взято из книги И. Г. Венецкого, В. И. Венецкой «Основные математико-статистические понятия и формулы в экономическом анализе»).

Алгоритмические ГСЧ

Числа, генерируемые с помощью этих ГСЧ, всегда являются псевдослучайными (или квазислучайными), то есть каждое последующее сгенерированное число зависит от предыдущего:

ri + 1 = f(ri).

Последовательности, составленные из таких чисел, образуют петли, то есть обязательно существует цикл, повторяющийся бесконечное число раз. Повторяющиеся циклы называются периодами.

Достоинством данных ГСЧ является быстродействие; генераторы практически не требуют ресурсов памяти, компактны. Недостатки: числа нельзя в полной мере назвать случайными, поскольку между ними имеется зависимость, а также наличие периодов в последовательности квазислучайных чисел.

Рассмотрим несколько алгоритмических методов получения ГСЧ:

Метод серединных квадратов

Имеется некоторое четырехзначное число R0. Это число возводится в квадрат и заносится в R1. Далее из R1 берется середина (четыре средних цифры) — новое случайное число — и записывается в R0. Затем процедура повторяется (см. рис. 22.6). Отметим, что на самом деле в качестве случайного числа необходимо брать не ghij, а 0.ghij — с приписанным слева нулем и десятичной точкой. Этот факт отражен как на рис. 22.6, так и на последующих подобных рисунках.

Рис. 22.6. Схема метода серединных квадратов

Недостатки метода: 1) если на некоторой итерации число R0 станет равным нулю, то генератор вырождается, поэтому важен правильный выбор начального значения R0; 2) генератор будет повторять последовательность через Mn шагов (в лучшем случае), где n — разрядность числа R0, M — основание системы счисления.

Для примера на рис. 22.6: если число R0 будет представлено в двоичной системе счисления, то последовательность псевдослучайных чисел повторится через 24 = 16 шагов. Заметим, что повторение последовательности может произойти и раньше, если начальное число будет выбрано неудачно.

Описанный выше способ был предложен Джоном фон Нейманом и относится к 1946 году. Поскольку этот способ оказался ненадежным, от него очень быстро отказались.

Метод серединных произведений

Число R0 умножается на R1, из полученного результата R2 извлекается середина R2* (это очередное случайное число) и умножается на R1. По этой схеме вычисляются все последующие случайные числа (см. рис. 22.7).

Рис. 22.7. Схема метода серединных произведений

Метод перемешивания

В методе перемешивания используются операции циклического сдвига содержимого ячейки влево и вправо. Идея метода состоит в следующем. Пусть в ячейке хранится начальное число R0. Циклически сдвигая содержимое ячейки влево на 1/4 длины ячейки, получаем новое число R0*. Точно так же, циклически сдвигая содержимое ячейки R0 вправо на 1/4 длины ячейки, получаем второе число R0**. Сумма чисел R0* и R0** дает новое случайное число R1. Далее R1 заносится в R0, и вся последовательность операций повторяется (см. рис. 22.8).

Рис. 22.8. Схема метода перемешивания

Обратите внимание, что число, полученное в результате суммирования R0* и R0**, может не уместиться полностью в ячейке R1. В этом случае от полученного числа должны быть отброшены лишние разряды. Поясним это для рис. 22.8, где все ячейки представлены восемью двоичными разрядами. Пусть R0* = 100100012 = 14510, R0** = 101000012 = 16110, тогда R0* + R0** = 1001100102 = 30610. Как видим, число 306 занимает 9 разрядов (в двоичной системе счисления), а ячейка R1 (как и R0) может вместить в себя максимум 8 разрядов. Поэтому перед занесением значения в R1 необходимо убрать один «лишний», крайний левый бит из числа 306, в результате чего в R1 пойдет уже не 306, а 001100102 = 5010. Также заметим, что в таких языках, как Паскаль, «урезание» лишних битов при переполнении ячейки производится автоматически в соответствии с заданным типом переменной.

Линейный конгруэнтный метод

Линейный конгруэнтный метод является одной из простейших и наиболее употребительных в настоящее время процедур, имитирующих случайные числа. В этом методе используется операция mod(x, y), возвращающая остаток от деления первого аргумента на второй. Каждое последующее случайное число рассчитывается на основе предыдущего случайного числа по следующей формуле:

ri + 1 = mod(k · ri + b, M).

M — модуль (0 

Генератор случайных чисел без повторения

Новый генератор случайных чисел без повторений. Он имеет обновленный алгоритм генерации чисел. Этот генератор исключает возможность повторения чисел. Генератор случайных чисел позволяет исключить отдельные числа из результата.

Для того чтобы сгенерировать число выберите исходное число. Выберите конечное число. Укажите количество чисел которые нужно генерировать. Дополнительно вы можете указать числа которые надо игнорировать.

Данный генератор чисел использует сложный алгоритм. Это гарантирует настоящую случайность выбора каждого числа.

Случайное число

Зачем нам случайные числа? Например, для слепого выбора. Это полезно при определении победителя лотереи. При определении победителя конкурса. При игре в лотерею. Когда вы хотите получить комбинацию цифр полностью случайно.

Это универсальный генератор случайных чисел. Он подходит для любых потребностей по получению случайного числа. Все полученные числа полностью случайными. От вас требуется только указать исходные данные. Остальные наш ГСЧ сделает за вас. Хорошо когда такой генератор случайностей всегда под рукой. Вы можете легко играть в лотерею. Будучи уверенным, что эти числа получены случайным образом.

Генератор случайных чисел для лотереи

Вы хотите получить случайные числа без повторения. Также вам не нужны некоторые числа. Потому что они по-вашему точно не выпадут. Вы легко настроите нужный вам режим нашего генератора чисел. И он будет выдавать вам только полезные комбинации чисел. Вам больше не нужно много разных генераторов. Этот ГСЧ является универсальным. Данный генератор легко настраивается под вас. Генератор не имеет никаких ограничений по количеству и диапазоне чисел. Данная генерация выполняется на стороне сервера а не вашего браузера. Мы устранили все факторы могут повлиять на результат случайного выбора.

Новый генератор ГСЧ

Наш генератор случайных значений перемешивает числа несколько раз. Мы не просто генерируем случайные числа. Мы сначала перетасовывает местами все числа среди которых надо выбрать. Это делается несколько раз. И только после этого мы еще раз случайно выбираем заданное количество чисел. Такой подход к генерации случайных чисел гарантирует случайность выбора.


Смотрите также