Применимо к линейке ОС Windows NT, начиная, как минимум с Windows 2000, x86 и x64 версий[прим. ред.]
Командный процессор Windows (CMD) содержит встроенную переменную %RANDOM%
, которую можно использовать для генерации случайных чисел.%RANDOM%
генерирует случайное целое число от 0
до 32767
(включительно).echo %RANDOM%
Диапазон генерируемых чисел можно уменьшить с помощью небольшого лайфхака, команда SET
не только устанавливает значение пользовательских переменных окружения, но и может производить простейшие арифметические операции.
Например, можно сгенерировать случайные числа в диапазоне от 1
до 500
:@ECHO OFF
SET /a _rand=(%RANDOM%*500/32768)+1
ECHO Random number: %_rand%
Если попытаться сгенерировать случайные числа больше чем 32767
, то это приведет к проблемам, хотя с виду все будет работать. Например, если в вышеприведенном коде заменить 500
на 65536
, то это приведет к генерации последовательности "случайных" чисел, которая будет состоять только из нечетных чисел.
Распределение возвращаемых чисел определяется, как диапазоном, так и количеством итераций генерации случайных чисел.
Например, если вы генерируете числа в диапазоне от 1 до 100 то в среднем:
- При генерации 10 чисел, примерно 6% будут дублироваться
- При генерации 100 чисел, этот процент вырастет до 63, т.е. 63% сгенерированных чисел будут дубликатами, т.е. совпадать с одним или несколькими из остальных 99 чисел.
- Если сгенерировать 1000 чисел, почти все будут дублироваться, т.к. есть только 100 возможных значений.
Псевдослучайная последовательность не является истинно случайной и определяется небольшим набором начальных условий.
В случае
%RANDOM%
, начальное значение зависит от текущего времени (системного таймера), когда произошел запуск экземпляра командного процессора. Это может создать проблему, когда проходит примерно одно и то же время перед обращением к переменной %RANDOM%
и запуском самого скрипта, одновременно со стартом экземпляра командного процессора. Возвращаемое число будет находиться в небольшом предсказуемом диапазоне.В качестве примера создайте файл
numbers.cmd
, содержащий следующий код:@Echo off
Echo %RANDOM%
И запустите его следующим образом:
cmd /c numbers.cmd
cmd /c numbers.cmd
cmd /c numbers.cmd
...
Раймонд Чен из MSFT подробно описывает, почему
%RANDOM%
в cmd.exe не такой уж случайный.Йоханнес Баагё опубликовал сравнение лучших алгоритмов генерации случайных чисел на javascript. Самый быстрый из них - Alea(), копия которого представлена по ссылкам ниже или в источнике.
Эта реализация имеет ряд преимуществ: можно генерировать числа большие, чем позволяет
%RANDOM%
, можно быстро сгенерировать много чисел, можно создавать псевдослучайные последовательности, т.е., результаты станут повторяемы, если вы вызовете скрипт с указанием одного и того же начального числа, т.е сами зададите начальные условия.Впрочем, не стоит использовать эти "случайные числа" для чего-то серьезного, в винде так и нет нормального штатного генератора случайных чисел, и изначально не было. В худшем случае стоит пользоваться библиотеками криптопровайдера, в лучшем - аппаратным генератором. (прим. ред.)
Скрипт random.js на PasteBin
Источник
Перевел Серёга "PTZSnake jr." Неклюев
Специально для Tolik-punkoff.com
Редактор: Leha Silent
Все права идут нахуй.
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2021/07/31/cmd-b