Толик Панков
hex_laden
............ .................. ................
October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
CMD/BAT, генерация случайных чисел.

Применимо к линейке ОС 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-bat-generatsiya-sluchajnyh-chisel/