Чудили ли сте се някога как работи Math.random()? Какво е произволно число и как се получава? И си представете въпрос на интервю - напишете своя генератор на произволни числа в няколко реда код. И така, какво е това, злополука и възможно ли е да се предвиди?

Много ме увличат различни IT пъзели и пъзели, а генераторът на случайни числа е един от тези пъзели. Обикновено в моя телеграм канал подреждам всякакви пъзели и различни задачи от интервюта. Проблемът с генератора на случайни числа придоби голяма популярност и исках да го увековеча в дълбините на един от авторитетните източници на информация - тоест тук на Хабре.

Този материал ще бъде полезен за всички онези фронтендъри и разработчици на Node.js, които са в челните редици на технологиите и искат да влязат в блокчейн проекта / стартирането, където се задават въпроси относно сигурността и криптографията, поне на основно ниво дори от разработчици от предния край.

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

За да получим нещо случайно, имаме нужда от източник на ентропия, източник на някакъв вид хаос, от който ще генерираме случайност.

Този източник се използва за натрупване на ентропия и след това получаване от нея на първоначалната стойност (първоначална стойност, начална стойност), която е необходима на генераторите на произволни числа (RNG) за генериране на произволни числа.

Генераторът на псевдо-случайни числа използва една начална стойност, откъдето идва неговата псевдо-случайност, докато генераторът на случайни числа винаги генерира произволно число, започвайки с висококачествена произволна стойност, която е взета от различни източници на ентропия.

Ентропия - е мярка за безпорядък. Информационната ентропия е мярка за несигурността или непредсказуемостта на информацията.
Оказва се, че за да създадем псевдослучайна последователност, се нуждаем от алгоритъм, който ще генерира някаква последователност въз основа на определена формула. Но такава последователност може да се предвиди. Но нека си представим как бихме могли да напишем наш собствен генератор на случайни числа, ако нямахме Math.random()

PRNG има някакъв алгоритъм, който може да бъде възпроизведен.
RNG - е получаване на числа напълно от всякакъв шум, способността за изчисляване, който клони към нула. В същото време RNG има определени алгоритми за изравняване на разпределението.

Изобретяване на наш собствен PRNG алгоритъм

Генераторът на псевдослучайни числа (PRNG) е алгоритъм, който генерира поредица от числа, чиито елементи са почти независими един от друг и се подчиняват на дадено разпределение (обикновено равномерно).
Можем да вземем поредица от някои числа и да вземем модула на числото от тях. Най-простият пример, който идва на ум. Трябва да помислим каква последователност да вземем и модула от какво. Ако просто директно от 0 до N и модул 2, тогава получавате генератор на 1 и 0:

Функция* 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, започвайки от някаква неизвестна точка. Пример за такъв алгоритъм с базирана на PI последователност и модулна промяна:

Const вектор = [...Math.PI.toFixed(48).replace(".","")]; функция* rand() ( за (нека i=3; i<1000; i++) { if (i >99) i = 2; за (нека n=0; n Но в JS числото PI може да се показва само до 48 знака и не повече. Следователно все още е лесно да се предвиди такава последователност и всяко стартиране на такъв генератор винаги ще произвежда едни и същи числа. Но нашият генератор вече е започнал да показва числа от 0 до 9.

Имаме генератор на числа от 0 до 9, но разпределението е много неравномерно и ще генерира една и съща последователност всеки път.

Можем да вземем не числото Пи, а времето в числово представяне и да разглеждаме това число като последователност от цифри и за да предотвратим последователността да се повтаря всеки път, ще я четем от края. Общо нашият алгоритъм за нашия PRNG ще изглежда така:

Функция* rand() ( let newNumVector = () => [...(+нова дата)+""].reverse(); let vector = newNumVector(); let i=2; while (true) ( ​​​​ако ( i++ > 99) i = 2; нека n=-1; докато (++n< vector.length) yield (vector[n] % i); vector = newNumVector(); } } // TEST: let i = 0; for (let x of rand()) { if (i++ >100) прекъсване; console.log(x) )
Сега изглежда като генератор на псевдослучайни числа. И същият Math.random() - е PRNG, ще говорим за него малко по-късно. Освен това всеки път първото число е различно.

Всъщност на тези прости примери можете да разберете как работят по-сложните генератори на случайни числа.И дори има готови алгоритми. Например, нека анализираме един от тях - това е линейният конгруентен PRNG (LCPRNG).

Линеен конгруентен PRNG

Линейният конгруентен PRNG (LCPRNG) -  е често срещан метод за генериране на псевдослучайни числа. Няма криптографска сила. Този метод се състои в изчисляване на членовете на линейна рекурентна последователност по модул на някакво естествено число m, дадено с формула. Получената последователност зависи от избора на началното число - т.е. семе. За различни начални стойности се получават различни последователности от произволни числа. Пример за внедряване на такъв алгоритъм в JavaScript:

Const a = 45; const c = 21; const m = 67; varseed = 2; const rand = () => семе = (a * семе + c) % m; за (нека i=0; i<30; i++) console.log(rand())
Много езици за програмиране използват LCPRNG (но не само такъв алгоритъм (!).

Както бе споменато по-горе, такава последователност може да бъде предвидена. Така че защо имаме нужда от PRNG? Ако говорим за сигурност, тогава PRNG е проблем. Ако говорим за други задачи, тогава тези свойства  -  могат да играят плюс. Например, за различни специални ефекти и графични анимации може да се наложи често да извиквате произволно. И тук разпределението на ценностите и представянето са важни! Алгоритмите за сигурност не могат да се похвалят със скорост.

Друго свойство - възпроизводимост. Някои реализации ви позволяват да посочите семе, което е много полезно, ако една последователност трябва да се повтори. Възпроизвеждането е необходимо при тестове, например. И има много други неща, които не изискват защитен RNG.

Как работи Math.random().

Методът Math.random() връща псевдослучайно число с плаваща запетая от диапазона = crypto.getRandomValues(new Uint8Array(1)); регистрационен файл на конзолата (rvalue)
Но за разлика от PRNG Math.random(), този метод изисква много ресурси. Факт е, че този генератор използва системни повиквания в операционната система за достъп до източници на ентропия (адрес на мак, процесор, температура и т.н. ...).

За да генерирате произволни числа в диапазона, от който се нуждаете, най-добре е да използвате Онлайн генератора на произволни числа. Наличието на голям брой опции ще ви позволи да изберете необходимия брой произволни числа, както и да посочите крайната и първоначалната стойност.

Инструкция за онлайн генератор на числа (randomizer):

По подразбиране генераторът на случайни числа се въвежда с 1 число. Ако промените настройките на приложението, можете едновременно да генерирате до 250 произволни числа. Първо трябва да зададете диапазона. Максималната стойност на число е 9 999 999 999. Генераторът на случайни числа ви позволява да подреждате числа в низходящ, възходящ или произволен ред.

За да покажете резултата, можете да използвате различни разделители: точка и запетая, запетая и интервал. Освен това е възможно повторение. Опцията „Изключване на повторенията“ ще ви позволи да се отървете от дублирането. Можете също така да изпратите линк към изчисленията, направени чрез месинджър или имейл, като копирате „Линк към резултата“.

Моля, помогнете на услугата с едно кликване:Кажете на приятелите си за генератора!

Генератор на числа онлайн с 1 щракване

Генераторът на произволни числа, който е представен на нашия уебсайт, е много удобен. Например, може да се използва в тегления и лотарии за определяне на победителя. Победителите се определят по следния начин: програмата дава едно или повече числа във всеки диапазон, който посочите. Манипулирането на резултатите може да бъде незабавно елиминирано. И благодарение на това победителят се определя в честен избор.

Понякога трябва да получите определен брой произволни числа наведнъж. Например искате да попълните лотарийски билет „4 от 35“, като се доверите на шанса. Можете да проверите: ако хвърлите монета 32 пъти, каква е вероятността 10 обръщания да паднат подред (главите / опашките могат да бъдат зададени от числата 0 и 1)?

Случайно число онлайн видео инструкция - рандомайзер

Нашият генератор на числа е много лесен за използване. Не изисква изтегляне на програма на компютър - може да се използва онлайн. За да получите необходимото число, трябва да зададете диапазона от произволни числа, числото и, ако желаете, разделителя на числата и да изключите повторенията.

За да генерирате произволни числа в определен честотен диапазон:

  • Изберете диапазон;
  • Посочете броя на произволните числа;
  • Функцията "Разделител на цифри" служи за красотата и удобството на тяхното показване;
  • Ако е необходимо, активирайте / деактивирайте повторенията с отметка;
  • Щракнете върху бутона "Генериране".

В резултат на това ще получите произволни числа в даден диапазон. Резултатът от генератора на числа може да бъде копиран или изпратен на имейл. Най-добре би било да направите екранна снимка или видеоклип на този процес на генериране. Нашият рандомизатор ще реши всяка ваша задача!

Имаме поредица от числа, състояща се от почти независими елементи, които се подчиняват на дадено разпределение. Обикновено равномерно разпределени.

Можете да генерирате произволни числа в Excel по различни начини и начини. Нека да разгледаме най-добрите от тях.

Функция за произволни числа в Excel

  1. Функцията RAND връща произволно равномерно разпределено реално число. Ще бъде по-малко от 1, по-голямо или равно на 0.
  2. Функцията RANDBETWEEN връща произволно цяло число.

Нека да разгледаме използването им с примери.

Избиране на произволни числа с RAND

Тази функция не изисква никакви аргументи (RAND()).

За да генерирате произволно реално число между 1 и 5, например, използвайте следната формула: =RAND()*(5-1)+1.

Върнатото произволно число е равномерно разпределено в интервала.

Всеки път, когато работният лист се изчислява или стойността в която и да е клетка в работния лист се промени, се връща ново произволно число. Ако искате да запазите генерираната популация, можете да замените формулата с нейната стойност.

  1. Щракваме върху клетка с произволно число.
  2. Маркирайте формулата в лентата с формули.
  3. Натиснете F9. И ВЛЕЗЕТЕ.

Нека проверим равномерността на разпределението на произволни числа от първата проба с помощта на хистограмата на разпределението.


Обхватът на вертикалните стойности е честотата. Хоризонтално - "джобове".



Функция RANDBETWEEN

Синтаксисът на функцията RANDBETWEEN е (долна граница; горна граница). Първият аргумент трябва да е по-малък от втория. В противен случай функцията ще изведе грешка. Предполага се, че границите са цели числа. Формулата отхвърля дробната част.

Пример за използване на функцията:

Случайни числа с точност 0,1 и 0,01:

Как да направите генератор на произволни числа в Excel

Нека направим генератор на случайни числа с генериране на стойност от определен диапазон. Използваме формула като: =INDEX(A1:A10;INTEGER(RAND()*10)+1).

Нека направим генератор на произволни числа в диапазона от 0 до 100 със стъпка 10.

От списъка с текстови стойности трябва да изберете 2 произволни. С помощта на функцията RAND сравняваме текстови стойности в диапазона A1: A7 с произволни числа.

Нека използваме функцията INDEX, за да изберем две произволни текстови стойности от оригиналния списък.

За да изберете една произволна стойност от списъка, приложете следната формула: =INDEX(A1:A7,RANDBETWEEN(1,COUNT(A1:A7))).

Генератор на случайни числа с нормално разпределение

Функциите RAND и RANDBETWEEN произвеждат произволни числа с едно разпределение. Всяка стойност с еднаква вероятност може да попадне в долната граница на заявения диапазон и в горната. Оказва се огромен спред от целевата стойност.

Нормалното разпределение означава, че повечето от генерираните числа са близки до целта. Нека коригираме формулата RANDBETWEEN и създадем масив от данни с нормално разпределение.

Цената на стоките X е 100 рубли. Цялата произведена партида подлежи на нормално разпределение. Случайната променлива също следва нормално разпределение на вероятностите.

При такива условия средната стойност на диапазона е 100 рубли. Нека генерираме масив и изградим графика с нормално разпределение със стандартно отклонение от 1,5 рубли.

Използваме функцията: =NORMINV(RAND();100;1.5).

Excel изчислява кои стойности са в обхвата на вероятностите. Тъй като вероятността за производство на продукт с цена от 100 рубли е максимална, формулата показва стойности, близки до 100, по-често от останалите.

Да преминем към чертането. Първо трябва да създадете таблица с категории. За да направим това, разделяме масива на периоди:

Въз основа на получените данни можем да формираме диаграма с нормално разпределение. Оста на стойността е броят на променливите в интервала, оста на категорията е периодите.

Представеният онлайн генератор на случайни числа работи на базата на софтуерен генератор на псевдослучайни числа, вграден в JavaScript с равномерно разпределение. Генерират се цели числа. По подразбиране се показват 10 произволни числа в диапазона 100...999, като числата са разделени с интервали.

Основни настройки на генератора на случайни числа:

  • Количество числа
  • Диапазон на номера
  • Тип сепаратор
  • Включване / изключване на функцията за премахване на повторения (удвояване на числа)

Общият брой е формално ограничен до 1000, максималният брой е 1 милиард. Опции за разделител: интервал, запетая, точка и запетая.

Сега знаете точно къде и как да получите безплатна последователност от произволни числа в даден диапазон в Интернет.

Случаи на използване на генератор на произволни числа

Генераторът на произволни числа (RNG на JS с равномерно разпределение) ще бъде полезен за SMM-специалисти и собственици на групи и общности в социалните мрежи Instagram, Facebook, Vkontakte, Odnoklassniki за определяне на победителите в лотарии, конкурси и тегления на награди.

Генераторът на произволни числа ви позволява да теглите награди сред произволен брой участници с определен брой победители. Състезанията могат да се провеждат без повторни публикации и коментари - вие сами задавате броя на участниците и интервала за генериране на произволни числа. Можете да получите набор от произволни числа онлайн и безплатно на този сайт и не е необходимо да инсталирате приложение на вашия смартфон или програма на вашия компютър.

Също така, онлайн генератор на произволни числа може да се използва за симулиране на хвърляне на монета или зарове. Но между другото имаме отделни специализирани услуги за тези случаи.