Применимо к линейке ОС 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
Все права идут нахуй.