batch-file
Случайные в пакетных файлах
Поиск…
Случайные числа
Используя динамическую переменную %Random%
, мы можем получить случайное целое число от 0 до 32767. Например:
echo %random%
Это, очевидно, возвращает целое число от 0 до 32767. Но иногда мы хотим, чтобы он находился в определенном диапазоне, скажем, от 1 до 100.
Генерация случайных чисел в пределах определенного диапазона
Ниже приведен базовый метод.
set /a result=(%RANDOM%*max/32768)+min
где max
- это верхнее число, которое может быть сгенерировано, а min
- наименьшее число, которое может быть сгенерировано. Обратите внимание, что вы не получите десятичных чисел, потому что set /a
автоматически округляется. Чтобы создать десятичное случайное число, попробуйте следующее:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Создание случайных чисел больше 32767
Если вы попытаетесь
set /a whole=(%RANDOM%*65536/32768)+1
вы, скорее всего, получите случайные числа, которые являются нечетными.
Чтобы генерировать числа, большие, чем 32767, вот лучший метод.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Предыдущий код извлекает 1 символ из каждого %random%
. Но это делается специально.
Так как random
число может быть однозначным числом, извлечение последних двух цифр не будет работать. Вот почему мы извлекаем только последний символ. В этом случае мы имеем 6 %random:~-1%
значений %random:~-1%
, генерируя максимум 999999
, а минимум в 000000
, возможно, вам придется отрегулировать это в соответствии с вашими потребностями.
псевдослучайный
cmd.exe
сгенерирует семя в зависимости от времени начала секции cmd
, поэтому, если вы начнете работу с несколькими разделами почти в одно и то же время, результат может быть недостаточно «случайным».
Случайные алфавиты
К сожалению, пакет не имеет встроенного метода для генерации алфавитов, но с использованием %random%
и for
цикла мы можем «генерировать» алфавиты.
Это простое представление о том, как это работает.
set /a result=(%random%*26/32768)+1
for /f "tokens=%result%" %%I in ("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do (
echo %%I
)
- Первый оператор
set /a
генерирует случайное числоN
от 1 до 26 - Оператор
for /f
выбираетN
й элемент из списка от A до Z.- Вернуть результат
Можно положить всего 31
элемент в 1 for
цикла и практически неограниченные элементы, используя [этот метод]. ( Batch - для параметра параметра цикла
Псевдослучайные и равномерные случайные в партии
Псевдослучайное распределение
Соглашаясь с этим ответом на переполнение стека , пользователь CherryDT указал на этот код:
set /a num=%random% %% 100
не дает равномерного распределения.
Внутренний переменные динамический %random%
делает дает равномерное распределение, но приведенный выше код не будет униформа случайным образом . Этот код генерирует случайное число между 0 ~ 99, но результат не будет равномерным. 0 ~ 67 произойдет более 68 ~ 99, поскольку 32767 MOD 100
= 67
.
Для генерации равномерного распределенного случайного использования с использованием вышеуказанного кода 100
необходимо изменить. Вот способ получить число, которое создает равномерное распределение.
32767 mod (32767 / n)
где n
- целое число, между 0 ~ 32767, результат может быть десятичным и может не работать в пакетном режиме.
Равномерное распределение
set /a result=(%RANDOM%*100/32768)+1
Этот метод будет генерировать равномерное распределение. Он избегает использования %
, что больше похоже на «остаток», а затем «модуль» в пакетном скрипте. Без использования %
результат будет равномерным.
Альтернативно, это неэффективный, но единый метод.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Измените [yourMinNumber]
и [yourMaxNumber]
соответствии с вашими собственными значениями.