HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Базовая генерация в JS</a></li>
1 <ul><li><a>Базовая генерация в JS</a></li>
2 <li><a>Подбрасываем монету (true либо false)</a></li>
2 <li><a>Подбрасываем монету (true либо false)</a></li>
3 <li><a>Пример генерации с исключениями</a></li>
3 <li><a>Пример генерации с исключениями</a></li>
4 <li><a>Генерируем случайное и неповторяющееся число</a></li>
4 <li><a>Генерируем случайное и неповторяющееся число</a></li>
5 <li><a>Пару слов о криптографии</a></li>
5 <li><a>Пару слов о криптографии</a></li>
6 </ul><p>При программировании на языке<strong>JavaScript</strong>(JS) нередко нужно выполнить такую операцию, как<strong>генерация случайных чисел</strong>. Это может понадобиться, когда в программу нужно привнести элемент случайности, причем не важно, о каком направлении разработки идет речь, будь то web-разработка, мобильная разработка или создание обычных десктопных приложений.</p>
6 </ul><p>При программировании на языке<strong>JavaScript</strong>(JS) нередко нужно выполнить такую операцию, как<strong>генерация случайных чисел</strong>. Это может понадобиться, когда в программу нужно привнести элемент случайности, причем не важно, о каком направлении разработки идет речь, будь то web-разработка, мобильная разработка или создание обычных десктопных приложений.</p>
7 <a></a><p>Где конкретно востребована генерация:</p>
7 <a></a><p>Где конкретно востребована генерация:</p>
8 <ul><li>в анимации;</li>
8 <ul><li>в анимации;</li>
9 <li>при создании рандомной компьютерной музыки;</li>
9 <li>при создании рандомной компьютерной музыки;</li>
10 <li>в процедуральном искусстве;</li>
10 <li>в процедуральном искусстве;</li>
11 <li>для вывода случайного изображения;</li>
11 <li>для вывода случайного изображения;</li>
12 <li>для рандомного выбора слов из списка, который создан заранее;</li>
12 <li>для рандомного выбора слов из списка, который создан заранее;</li>
13 <li>для создания API-ключей;</li>
13 <li>для создания API-ключей;</li>
14 <li>для вывода фрагментов текста;</li>
14 <li>для вывода фрагментов текста;</li>
15 <li>при генерации паролей, случайных чисел и т. д.</li>
15 <li>при генерации паролей, случайных чисел и т. д.</li>
16 </ul><p>В реальности существуют разные способы генерации, выбор которых зависит от конкретного программного приложения. О них - наша статья.</p>
16 </ul><p>В реальности существуют разные способы генерации, выбор которых зависит от конкретного программного приложения. О них - наша статья.</p>
17 <h2>Базовая генерация в JS</h2>
17 <h2>Базовая генерация в JS</h2>
18 <p>Наиболее простой способ получить random-число - это хорошо известный метод<strong>Math.random()</strong>, который встроен в JavaScript.</p>
18 <p>Наиболее простой способ получить random-число - это хорошо известный метод<strong>Math.random()</strong>, который встроен в JavaScript.</p>
19 <p>Math.random()</p>
19 <p>Math.random()</p>
20 <p>Пример вывода:</p>
20 <p>Пример вывода:</p>
21 <p>0.5097055147211202</p>
21 <p>0.5097055147211202</p>
22 <p>На практике метод<strong>Math.random()</strong>всегда осуществляет возврат числа с плавающей точкой в диапазоне между 0 и 1. Технически, это число может быть и нулем, однако оно точно никогда не будет равно 1.</p>
22 <p>На практике метод<strong>Math.random()</strong>всегда осуществляет возврат числа с плавающей точкой в диапазоне между 0 и 1. Технически, это число может быть и нулем, однако оно точно никогда не будет равно 1.</p>
23 <p>Так как метод очень популярен в использовании, его нередко помещают внутрь функции:</p>
23 <p>Так как метод очень популярен в использовании, его нередко помещают внутрь функции:</p>
24 function show_random_number() { var random_number = Math.random(); // generate random number between 0 and 1 }<p>Основной недостаток вышесказанного - функция будет создавать рандомное значение лишь в пределах весьма ограниченного диапазона. Но это не значит, что других путей генерации не существует.</p>
24 function show_random_number() { var random_number = Math.random(); // generate random number between 0 and 1 }<p>Основной недостаток вышесказанного - функция будет создавать рандомное значение лишь в пределах весьма ограниченного диапазона. Но это не значит, что других путей генерации не существует.</p>
25 <p>Генерация между числами: максимальные и минимальные значения (max, min)</p>
25 <p>Генерация между числами: максимальные и минимальные значения (max, min)</p>
26 <p>Для добавления данной функциональности без математики не обойтись.</p>
26 <p>Для добавления данной функциональности без математики не обойтись.</p>
27 <p>Также никто не мешает сгенерировать рандомное целое число в диапазоне, включая максимальное и минимальное.</p>
27 <p>Также никто не мешает сгенерировать рандомное целое число в диапазоне, включая максимальное и минимальное.</p>
28 <h2>Подбрасываем монету (true либо false)</h2>
28 <h2>Подбрасываем монету (true либо false)</h2>
29 <p>Иногда нужно просто получить орел или решку, то есть, по сути, 0 либо 1. Для этого пригодится простой код:</p>
29 <p>Иногда нужно просто получить орел или решку, то есть, по сути, 0 либо 1. Для этого пригодится простой код:</p>
30 function coinRandom() { return Math.floor(Math.random() * 2); } coinRandom();<p>Если же надо получить конкретно true либо false, то код следует немного изменить:</p>
30 function coinRandom() { return Math.floor(Math.random() * 2); } coinRandom();<p>Если же надо получить конкретно true либо false, то код следует немного изменить:</p>
31 function coinRandom() { return (Math.floor(Math.random() * 2) === 0); } coinRandom(); &gt;false<p>Также можно ассоциировать нужные слова со сторонами монеты, то есть вспоминаем пресловутые орел или решка (heads or tails).</p>
31 function coinRandom() { return (Math.floor(Math.random() * 2) === 0); } coinRandom(); &gt;false<p>Также можно ассоциировать нужные слова со сторонами монеты, то есть вспоминаем пресловутые орел или решка (heads or tails).</p>
32 function coinRandom() { return (Math.floor(Math.random() * 2) === 0) ? " heads" : " tails"; } coinRandom(); &gt; tails<h2>Пример генерации с исключениями</h2>
32 function coinRandom() { return (Math.floor(Math.random() * 2) === 0) ? " heads" : " tails"; } coinRandom(); &gt; tails<h2>Пример генерации с исключениями</h2>
33 <p>Этот метод работает для ограниченного диапазона целых чисел. Создается массив (array) числовых значений, которые интересуют, далее осуществляется выборка.</p>
33 <p>Этот метод работает для ограниченного диапазона целых чисел. Создается массив (array) числовых значений, которые интересуют, далее осуществляется выборка.</p>
34 var numPool = [ 1, 5, 9, 13 ], rand = numPool[Math.floor(Math.random() * numPool.length)];<p>Можно все это сделать более динамичным, добавив массив с целыми числами, которые надо исключить, а также пустой массив с результатом фильтрации 1-го во 2-ой.</p>
34 var numPool = [ 1, 5, 9, 13 ], rand = numPool[Math.floor(Math.random() * numPool.length)];<p>Можно все это сделать более динамичным, добавив массив с целыми числами, которые надо исключить, а также пустой массив с результатом фильтрации 1-го во 2-ой.</p>
35 <p>Потом следует:</p>
35 <p>Потом следует:</p>
36 <ul><li>создать цикл по массиву numPool;</li>
36 <ul><li>создать цикл по массиву numPool;</li>
37 <li>выполнить проверку, существует ли случайное число в нашем массиве исключений excludePool;</li>
37 <li>выполнить проверку, существует ли случайное число в нашем массиве исключений excludePool;</li>
38 <li>поместить результат в массив filteredPool.</li>
38 <li>поместить результат в массив filteredPool.</li>
39 </ul><p>По итогу отобразится случайное число из массива, который был отфильтрован.</p>
39 </ul><p>По итогу отобразится случайное число из массива, который был отфильтрован.</p>
40 <h2>Генерируем случайное и неповторяющееся число</h2>
40 <h2>Генерируем случайное и неповторяющееся число</h2>
41 <p>Когда речь идет о небольших наборах чисел, можно поступить следующим образом:</p>
41 <p>Когда речь идет о небольших наборах чисел, можно поступить следующим образом:</p>
42 <ul><li>создаем array, заполненный элементами;</li>
42 <ul><li>создаем array, заполненный элементами;</li>
43 <li>тасуем эти элементы рандомным образом;</li>
43 <li>тасуем эти элементы рандомным образом;</li>
44 <li>помещаем результаты в новый массив;</li>
44 <li>помещаем результаты в новый массив;</li>
45 <li>извлекаем перетасованные элементы 1 раз:</li>
45 <li>извлекаем перетасованные элементы 1 раз:</li>
46 </ul><p>Если же мы говорим о больших числовых наборах, то тут надо после создания заполнять array случайными целыми числами, причем следует отклонять любое число, которое раньше уже было сгенерировано:</p>
46 </ul><p>Если же мы говорим о больших числовых наборах, то тут надо после создания заполнять array случайными целыми числами, причем следует отклонять любое число, которое раньше уже было сгенерировано:</p>
47 <p>В вышеописанном коде numReserve заполнен двенадцатью рандомными значениями в диапазоне от 0 до 1000. Числа потом можно получить из массива.</p>
47 <p>В вышеописанном коде numReserve заполнен двенадцатью рандомными значениями в диапазоне от 0 до 1000. Числа потом можно получить из массива.</p>
48 <h2>Пару слов о криптографии</h2>
48 <h2>Пару слов о криптографии</h2>
49 <p>Выше мы показали ряд методов, однако их будет недостаточно, если идет разговор о создании функций с криптографической защитой. Для этих целей можно задействовать Web Cryptography API и создать типизированный array:</p>
49 <p>Выше мы показали ряд методов, однако их будет недостаточно, если идет разговор о создании функций с криптографической защитой. Для этих целей можно задействовать Web Cryptography API и создать типизированный array:</p>
50 <p>То есть мы создаем массив, где есть восемь слотов, причем каждый из них способен содержать 16-битное беззнаковое целое число. Можно выбрать и другие варианты:</p>
50 <p>То есть мы создаем массив, где есть восемь слотов, причем каждый из них способен содержать 16-битное беззнаковое целое число. Можно выбрать и другие варианты:</p>
51 <ul><li>int16Array,</li>
51 <ul><li>int16Array,</li>
52 <li>Int8Array,</li>
52 <li>Int8Array,</li>
53 <li>Uint8Array,</li>
53 <li>Uint8Array,</li>
54 <li>Int32Array,</li>
54 <li>Int32Array,</li>
55 <li>Uint32Array.</li>
55 <li>Uint32Array.</li>
56 </ul><p>Теперь мы можем заполнить array рандомными числами конкретного типа:</p>
56 </ul><p>Теперь мы можем заполнить array рандомными числами конкретного типа:</p>
57 <p>Пример выборки следующий:</p>
57 <p>Пример выборки следующий:</p>
58 <p>У Web Cryptography API - хорошая поддержка в современных веб-браузерах, хотя иногда нужно использовать префиксы.</p>
58 <p>У Web Cryptography API - хорошая поддержка в современных веб-браузерах, хотя иногда нужно использовать префиксы.</p>
59 <p>Хотите получить более глубокие знания по JavaScritpt? Обратите внимание на курсы по JS в Otus!</p>
59 <p>Хотите получить более глубокие знания по JavaScritpt? Обратите внимание на курсы по JS в Otus!</p>
60 <a></a><p>При подготовке статьи использовались следующие материалы:</p>
60 <a></a><p>При подготовке статьи использовались следующие материалы:</p>
61 <ul><li><em>http://thenewcode.com/82/Recipes-for-Randomness-in-JavaScript;</em></li>
61 <ul><li><em>http://thenewcode.com/82/Recipes-for-Randomness-in-JavaScript;</em></li>
62 <li><em>https://habr.com/ru/company/ruvds/blog/534108/.</em></li>
62 <li><em>https://habr.com/ru/company/ruvds/blog/534108/.</em></li>
63 </ul>
63 </ul>