Как использовать random в BATCH скрипте?

104

Как использовать random в BATCH скрипте?

IAdapter
источник
1
почему вы хотите делать это именно партиями?
Мат
На SuperUser есть очень интересный пост, связанный со случайными числами в пакетных скриптах, на который стоит ссылаться здесь ...
aschipfl

Ответы:

121

%RANDOM% дает вам случайное число от 0 до 32767.

Используя такое выражение, как SET /A test=%RANDOM% * 100 / 32768 + 1, вы можете изменить диапазон на что угодно (здесь диапазон [1… 100] вместо [0… 32767]).

Mousio
источник
9
Учитывая конкретную проблему, вы, скорее всего, будете использовать какой-то цикл? Тогда вы действительно должны использовать отложенное расширение, например, с помощью SETLOCAL ENABLEDELAYEDEXPANSIONи !RANDOM!вместо %RANDOM%, как написал Евгений.
mousio
14
Более общее выражение было бы %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; просто сначала установите minvalи maxvalна соответствующие значения.
mousio
1
См. Также ответ
indiv
55

% RANDOM% дает вам случайное число от 0 до 32767.

Вы можете контролировать диапазон номеров с помощью:

set /a num=%random% %%100

- выдаст число от 0 до 99.

Вот этот:

set /a num=%random% %%100 +1

- выдаст число от 1 до 100.

GaryNg
источник
8
Обратите внимание, что это не будет равномерно распределено! В примере с 0 ~ 99 числа 0 ~ 67 будут встречаться немного чаще, чем числа 68 ~ 99, потому что 32767 по модулю 100 равняется 67, а не 0, как это должно быть для равномерного распределения. (Это %random% %%100не волшебный синтаксис, но на самом деле %random % %% 100с одним пробелом меньше, где %%просто экранированный %
код,
Я получаю ошибку «Отсутствует операнд» при попытке сделать это в Windows 10. Похоже, вам нужен только один% для модуля.
Calmarius
19

Вы, вероятно, захотите получить несколько случайных чисел и, возможно, захотите указать разные диапазоны для каждого из них, поэтому вам следует определить функцию. В моем примере я генерирую числа от 25 до 30 с помощью call:rand 25 30. И результат будет RAND_NUMпосле того, как эта функция завершится.

@echo off & setlocal EnableDelayedExpansion

for /L %%a in (1 1 10) do (
        call:rand 25 30
        echo !RAND_NUM!
)

goto:EOF

REM The script ends at the above goto:EOF.  The following are functions.

REM rand()
REM Input: %1 is min, %2 is max.
REM Output: RAND_NUM is set to a random number from min through max.
:rand
SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
goto:EOF
индив
источник
спасибо, работайте хорошо: если для / L %% a in (1 1% 3 ') действительно вызовите: rand% 1% 2
Это был не я
5
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)
Евгений Гаврин
источник
4

Вы можете сделать это так, что не требует EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow

где maxваш максимум и minваш минимум. Это не очень эффективно, так как может потребоваться много раундов, если ваш диапазон слишком мал. Кроме того, это не сработает для чисел больше 32767.

calebhk98
источник
3

Допустим, вам нужен номер 1-5; вы можете использовать следующее:

    :LOOP
    set NUM=%random:~-1,1%
    if %NUM% GTR 5 (
    goto LOOP )
    goto NEXT

Или вы можете использовать: ~ 1,1 вместо: ~ -1,1. : ~ -1,1 не требуется, но он значительно сокращает время, необходимое для попадания в правильный диапазон. Допустим, вам нужно число от 1 до 50, нам нужно выбрать между 2 цифрами и 1 цифрой. Использование:

    :LOOP
    set RAN1=%random:~-1,1%
    if %RAN1% GTR 5 (
    goto 1 )
    if %RAN1%==5 (
    goto LOOP )
    goto 2

    :1
    set NUM=%random:~-1,1%
    goto NEXT

    :2
    set NUM=%random:~-1,2%
    goto NEXT

Вы можете добавить больше к этому алгоритму, чтобы выбирать между большими диапазонами, например 1-1000.

пользователь3542843
источник
3
Зачем вам использовать, gotoесли у вас может быть один лайнер, как указано выше? Другие решения позволяют явно указать диапазон. В чем преимущество вашего кода?
Макс Леске
2
set /a number=%random% %% [maximum]-[minimum]

пример "

set /a number=%random% %% 100-50

даст случайное число от 100 до 50. Обязательно используйте только один знак процента в качестве операнда, если вы не используете строку в пакетном скрипте!

Джейкоб
источник
В Windows 10 он дает числа от -50 до 49, как и должно быть. Было ли это когда-нибудь иначе?
kilves76,
2
@echo off
title Professional Hacker
color 02
:matrix
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
goto matrix
Sinji58
источник
1
дайте ему несколько пробелов, чтобы в нем были строки, например @echo off
Sinji58
1
@(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set C=1&set D=2&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
:Y
title %random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %D%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 9 (set D=1)ELSE set /A D=%D%+1)ELSE set /A C=%C%+1)&goto Y

упрощено с помощью нескольких операторов IF и большого количества ((()))

просто
источник
1

И просто чтобы быть совершенно случайным для тех, кто не всегда хочет черный экран.

@(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set A=0&set C=1&set V=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
:Y
(IF %A% EQU 10 set A=A)&(IF %A% EQU 11 set A=B)&(IF %A% EQU 12 set A=C)&(IF %A% EQU 13 set A=D)&(IF %A% EQU 14 set A=E)&(IF %A% EQU 15 set A=F)
(IF %V% EQU 10 set V=A)&(IF %V% EQU 11 set V=B)&(IF %V% EQU 12 set V=C)&(IF %V% EQU 13 set V=D)&(IF %V% EQU 14 set V=E)&(IF %V% EQU 15 set V=F)
(IF %A% EQU %V% set A=0)
title %A%%V%%random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %A%%V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&SET /A A=%random% %%15 +1&SET /A V=%random% %%15 +1)ELSE set /A C=%C%+1)&goto Y

Это изменит цвет экрана, также оба являются случайными.

стойкость
источник
1

Если вы разделите на какое-то большое значение, вы получите огромное количество дубликатов один за другим. Что вам нужно сделать, так это взять по модулю значение% RANDOM%:

@echo off
REM 
SET maxvalue=10
SET minvalue=1

SETLOCAL 
SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
echo "Tmp random: %tmpRandom%"
echo "Random:  %RANDOM%"
ENDLOCAL
Квант
источник
0

вот пример, который я создал для вас, он должен отображать диалоговое окно с просьбой выбрать число от 1 до 10, в зависимости от выбранного числа, он сгенерирует пример случайного числа для командного файла, который вы назвали. Если вы выберете «1», вы получите пример случайного 1-значного числа. если вы выберете «10», вы получите пример случайного 10-значного числа.

@echo off
color f0
set /p "FileName= Enter Filename (Without Extension) : "
echo @echo off >> %FileName%.bat
echo File Created!
pause
cls
:CommandLine
set /p "calc= ~%ComputerName%: Enter a number to recieve the amount of  random digits :"
if %calc%==genrand_help goto GenerateRandomHelp
if %calc%==1 echo echo %%RANDOM:~-1%% >> %FileName%.bat
if %calc%==2 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
if %calc%==3 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%RANDOM:~-1%% >>  %FileName%.bat
if %calc%==4 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==5 echo echo %%Random%% >> %FileName%.bat
if %calc%==6 echo echo %%Random%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==7 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
if %calc%==8 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
if %calc%==9 echo echo  %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >>  %FileName%.bat
if %calc%==10 echo echo %%Random%%%%Random%% >> %FileName%.bat  
goto CommandLine
заск
источник
-1

теперь представлены все цвета радуги дос

@(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)
  ELSE set C=1&set D=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
:Y
set V=%D%

(IF %V% EQU 10 set V=A) 
    & (IF %V% EQU 11 set V=B)
    & (IF %V% EQU 12 set V=C)
    & (IF %V% EQU 13 set V=D) 
    & (IF %V% EQU 14 set V=E)
    & (IF %V% EQU 15 set V=F)
title %random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%
&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 15 (set D=1)ELSE set /A D=%D%+1)
  ELSE set /A C=%C%+1)&goto Y
рандомизированный
источник
Я думаю, что это сломано
Дитя Божье
-1

И чтобы быть совершенно случайным, полное отсутствие порядка: SET /A V=%random% %%15 +1

@(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set C=1&set V=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
:Y
(IF %V% EQU 10 set V=A)&(IF %V% EQU 11 set V=B)&(IF %V% EQU 12 set V=C)&(IF %V% EQU 13 set V=D)&(IF %V% EQU 14 set V=E)&(IF %V% EQU 15 set V=F)
title %V%%random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&SET /A V=%random% %%15 +1)ELSE set /A C=%C%+1)&goto Y
рандомизированный
источник