Поиск…


Случайные числа

Используя динамическую переменную %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] соответствии с вашими собственными значениями.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow