BATCH 스크립트에서 무작위로 사용하는 방법은 무엇입니까?


103

BATCH 스크립트에서 무작위로 사용하는 방법은 무엇입니까?


1
이 작업을 일괄 적으로 수행하려는 이유는 무엇입니까?
Mat

여기에서 참조 할 가치가있는 배치 스크립트의 난수와 관련된 SuperUser에 대한 매우 흥미로운 게시물 이 있습니다 ...
aschipfl

답변:


121

%RANDOM% 0에서 32767 사이의 임의의 숫자를 제공합니다.

와 같은 표현식을 사용 SET /A test=%RANDOM% * 100 / 32768 + 1하여 범위를 원하는대로 변경할 수 있습니다 (여기서 범위는 [0… 32767] 대신 [1… 100]입니다).


9
특정 문제가 주어지면 일종의 루프를 사용할 가능성이 큽니까? 그런 다음 실제로 Eugene이 게시 한 것처럼을 통해 SETLOCAL ENABLEDELAYEDEXPANSION및 사용 !RANDOM!하는 %RANDOM%것과 같이 지연된 확장을 사용해야합니다 .
mousio 2011

14
보다 일반적인 표현은 다음과 같습니다 %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%. 다만 세트 minvalmaxval제 적절한 값이다.
mousio 2011

1
참조
indiv

55

% RANDOM %는 0에서 32767 사이의 임의의 숫자를 제공합니다.

다음을 사용하여 번호의 범위를 제어 할 수 있습니다.

set /a num=%random% %%100

-0 ~ 99 사이의 숫자를 생성합니다.

이 하나:

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

-1 ~ 100 사이의 숫자를 생성합니다.


8
이것은 균일하게 배포되지 않습니다! 0 ~ 99의 예를 들어, 0 ~ 67의 숫자는 68 ~ 99보다 약간 더 자주 발생합니다. 왜냐하면 32767 모듈로 100은 67이고 균등 분포를 위해 0이 아니기 때문입니다. (이것은 %random% %%100마법의 구문이 아니지만 실제로 %random % %% 100는 공간이 하나 더 적습니다 . %%%
여기서는

Windows 10에서이 작업을 시도 할 때 "Missing operand"오류가 발생합니다. 모듈로에 대한 단일 % 만 필요한 것 같습니다.
Calmarius

19

여러 개의 난수를 얻고 싶을 것이고 각각에 대해 다른 범위를 지정할 수 있기를 원할 것이므로 함수를 정의해야합니다. 내 예에서는 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

thx, 잘 작동합니다 : if for / L %% a in (1 1 % 3 ') do call : rand % 1 % 2
It was n't Me


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보다 큰 숫자에는 작동하지 않습니다.


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과 같은 큰 범위 중에서 결정할 수 있습니다.


3
goto위와 같이 하나의 라이너를 가질 수 있는데 왜 사용 합니까? 다른 솔루션을 사용하면 범위를 명시 적으로 지정할 수 있습니다. 코드의 장점은 무엇입니까?
Max Leske 2014

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

1
@echo off
Sinji58 dec

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.