Тема: CMD/BAT: генерация случайного числа из диапазона значений
Бывают случаи когда необходимо сгенерировать случайное число из определённого диапазона.
Переменная %random% раскрывается в случайное десятичное число от 0 до 32767. На первый взгляд получить от неё что-то полезное не представляется возможным.
Но если задействовать арифметические возможности команды set, то можно получить желаемый результат.
Например, нам необходимо сгенерировать случайное число от 0 до 5:
set /a 1+5*%random%/32768
простой пример "Русской рулетки":
@echo off
set /a RND=2*%random%/32767>NUL
if %RND%==0 (echo Нет)
if %RND%==1 (echo Да)
Для генерации числа из определённого диапазона, следует воспользоваться следующей конструкцией:
SET /A R=MIN+(MAX-MIN+1)*%random%/32768
MIN - минимальное значение
MAX - максимальное значение
Переменная R принимает случайное значение. Переменные MIN и MAX определяют при этом нижнюю и верхнюю границу желаемого числового диапазона (MIN<R<MAX), причем значения могут быть и отрицательными. Выражение (MAX-MIN+1) представляет собой количество элементов в сгенерированном таким образом числовом промежутке.
Пример генератора случайных чисел от -50 до 50:
set MIN=-50
set MAX=50
set /a R=MIN+(MAX-MIN+1) * %random%/32768
echo Random number from range -50..50 : %R%
========================================================================
Вынесем генератор в отдельную функцию:
:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768
Тогда обращение к функции в скрипте будет выглядеть, примерно, так:
call :RND -10 10 n
-10 - минимальное значение,
10 - максимальное значение,
n - возвращаемая переменная содержащая случайное число.
Итак, многообразному применению случайных чисел в командных файлах больше ничто не препятствует. Среди возможных применений - управление итерациями, ветвление для перехода на заданные ветви или файлы, а также параметризация вызовов программ.