Как использовать случайный в сценарии BATCH? - PullRequest
96 голосов
/ 25 апреля 2011

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

Ответы [ 14 ]

108 голосов
/ 25 апреля 2011

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

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

50 голосов
/ 01 ноября 2011

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

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

set /a num=%random% %%100

- будет производить число между0 ~ 99.

Этот:

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

- будет производить число от 1 до 100.

16 голосов
/ 28 апреля 2011

Возможно, вы захотите получить несколько случайных чисел и захотите иметь возможность указать разные диапазоны для каждого из них, поэтому вам следует определить функцию.В моем примере я генерирую числа от 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
4 голосов
/ 25 апреля 2011
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)
3 голосов
/ 13 апреля 2014

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

:choosenamea
cls
set /a choosemname=%random%

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

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

3 голосов
/ 14 июля 2013
set /a number=%random% %% [maximum]-[minimum]

пример "

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

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

2 голосов
/ 17 апреля 2014

Допустим, вы хотите число 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.

2 голосов
/ 27 декабря 2013
@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
1 голос
/ 14 мая 2018

Если вы поделите на какое-то большое значение, вы получите огромное количество дубликатов один за другим. То, что вам нужно сделать, это взять по модулю значение% 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
1 голос
/ 30 декабря 2014

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

@(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

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

...