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%
앞의 코드는 각 %random%
에서 1 문자를 추출합니다. 그러나 이것은 의도적으로 행해진 다.
random
는 한 자리 숫자가 될 수 있으므로 마지막 두 자리를 추출하면 작동하지 않습니다. 그래서 우리는 마지막 문자 만 추출합니다. 이 경우 6 %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
문은 1- 26 사이의 난수N
생성합니다. -
for /f
문은 A부터 Z까지의 목록에서N
번째 항목을 선택합니다.- 결과 반환
1 for
루프에 총 31
항목을 넣을 수 있으며 [this method]를 사용하면 실질적으로 무제한 항목을 배치 할 수 있습니다 ( Batch - for 루프 매개 변수 순서
배치의 임의 및 무작위 무작위
의사 랜덤 분포
이 스택 오버플로 대답 Accorinding 사용자 CherryDT이 코드를 지적했다 :
set /a num=%random% %% 100
균일 한 분포를 제공하지 않는다.
내부 동적 변수 %random%
는 균일 한 분포 를 제공하지만 위의 코드는 일정한 무작위가 아닙니다. 이 코드는 0에서 99 사이의 난수를 생성하지만 결과는 일정하지 않습니다. 32767 MOD 100
= 67
이므로 0 ~ 67은 68 ~ 99 32767 MOD 100
됩니다.
위의 코드를 사용하여 균일 한 분산 랜덤을 생성하려면 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]
를 자신의 값에 [yourMinNumber]
변경하십시오.