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] соответствии с вашими собственными значениями.