수색…


난수

동적 변수 %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.execmd 섹션이 시작된 시간을 기준으로 시드를 생성하므로 거의 동일한 시간에 여러 섹션을 시작하면 결과가 '무작위'로 충분하지 않을 수 있습니다.

무작위 알파벳

불행하게도, 배치에는 알파벳을 생성하는 내장 메서드가 없지만 %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] 변경하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow