Làm thế nào để sử dụng ngẫu nhiên trong tập lệnh BATCH?


103

Làm thế nào để sử dụng ngẫu nhiên trong tập lệnh BATCH?


1
tại sao bạn muốn làm điều này cụ thể theo lô?
Mat

Có một rất thú vị đăng trên superuser liên quan đến các số ngẫu nhiên trong kịch bản hàng loạt giá trị đang được tham chiếu ở đây ...
aschipfl

Câu trả lời:


121

%RANDOM% cung cấp cho bạn một số ngẫu nhiên từ 0 đến 32767.

Sử dụng một biểu thức như SET /A test=%RANDOM% * 100 / 32768 + 1, bạn có thể thay đổi phạm vi thành bất kỳ thứ gì bạn thích (ở đây phạm vi là [1… 100] thay vì [0… 32767]).


9
Với vấn đề cụ thể, bạn rất có thể sẽ sử dụng một số loại vòng lặp? Sau đó, bạn thực sự nên sử dụng mở rộng bị trì hoãn, ví dụ qua SETLOCAL ENABLEDELAYEDEXPANSIONvà sử dụng !RANDOM!thay vì %RANDOM%, như Eugene đã đăng.
mousio

14
Một biểu thức tổng quát hơn sẽ là %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; chỉ cần đặt minvalmaxvalđến các giá trị thích hợp trước.
mousio,


55

% RANDOM% cung cấp cho bạn một số ngẫu nhiên từ 0 đến 32767.

Bạn có thể kiểm soát phạm vi của số với:

set /a num=%random% %%100

- sẽ tạo ra số từ 0 ~ 99.

Cái này:

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

- sẽ tạo ra số từ 1 ~ 100.


8
Lưu ý rằng điều này sẽ không được phân phối đồng nhất! Lấy ví dụ 0 ~ 99, các số 0 ~ 67 sẽ xảy ra thường xuyên hơn một chút so với các số 68 ~ 99 vì 32767 modulo 100 là 67 chứ không phải 0 vì nó sẽ phải có để có phân phối đồng đều. (Đây %random% %%100không phải là cú pháp ma thuật nhưng thực sự %random % %% 100với một khoảng trống nhỏ hơn, trong đó dấu %%chỉ là một ký tự thoát %viết tắt của modulo.)
CherryDT

Tôi đang gặp lỗi "Thiếu toán hạng" khi thử điều này trên Windows 10. Có vẻ như bạn chỉ cần một singe% cho modulo.
Calmarius

19

Có thể bạn sẽ muốn nhận một số số ngẫu nhiên và có thể muốn chỉ định một phạm vi khác nhau cho mỗi số, vì vậy bạn nên xác định một hàm. Trong ví dụ của tôi, tôi tạo các số từ 25 đến 30 với call:rand 25 30. Và kết quả là RAND_NUMsau khi chức năng đó thoát.

@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, công việc tốt đẹp: nếu cho / L %% một trong (1 1% 3 ') làm cuộc gọi: rand% 1% 2
Đó không phải là nhớ

5
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)

4

Bạn có thể làm theo cách này, không yêu cầu EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

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

đâu maxlà mức tối đa của bạn và đâu minlà mức tối thiểu của bạn. Điều này không hiệu quả lắm vì có thể mất nhiều vòng nếu phạm vi của bạn quá nhỏ. Ngoài ra, điều này sẽ không hoạt động đối với các số lớn hơn 32767.


3

Giả sử bạn muốn một số 1-5; bạn có thể sử dụng như sau:

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

Hoặc bạn có thể sử dụng: ~ 1,1 thay cho: ~ -1,1. Dấu: ~ -1,1 là không cần thiết, nhưng nó làm giảm đáng kể thời gian cần để đạt đúng phạm vi. Giả sử bạn muốn một số từ 1-50, chúng ta cần quyết định giữa 2 chữ số và 1 chữ số. Sử dụng:

    :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

Bạn có thể thêm nhiều hơn vào thuật toán này để quyết định giữa các phạm vi lớn, chẳng hạn như 1-1000.


3
Tại sao bạn sẽ sử dụng gotokhi bạn có thể có một lớp lót như trên? Các giải pháp khác cho phép bạn chỉ định phạm vi rõ ràng. Lợi thế của mã của bạn là gì?
Max Leske

2
set /a number=%random% %% [maximum]-[minimum]

thí dụ "

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

sẽ cung cấp một số ngẫu nhiên từ 100 đến 50. Hãy chắc chắn chỉ sử dụng một dấu phần trăm làm toán hạng nếu bạn không sử dụng dòng trong tập lệnh lô!


Trên Windows 10, nó cung cấp các số từ -50 đến 49, đúng như vậy. Nó đã bao giờ thực sự làm khác?
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
cung cấp cho này một số không gian vì vậy nó có nó dòng, như @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

được đơn giản hóa với nhiều câu lệnh IF và nhiều ((()))


1

Và hoàn toàn ngẫu nhiên cho những người không phải lúc nào cũng muốn màn hình đen.

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

Điều này sẽ thay đổi màu màn hình và cả hai đều là ngẫu nhiên.


1

Nếu bạn chia cho một số giá trị lớn, bạn sẽ nhận được một lượng lớn các bản sao lần lượt. Những gì bạn cần làm là lấy modulo của giá trị% 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

đây là một ví dụ tôi đã tạo cho bạn, nó sẽ hiển thị một hộp thoại yêu cầu bạn chọn một số từ 1-10, tùy thuộc vào số bạn chọn, nó sẽ tạo một ví dụ số ngẫu nhiên cho một tệp hàng loạt mà bạn đã đặt tên. Nếu bạn chọn "1" thì bạn sẽ nhận được một ví dụ về số có 1 chữ số ngẫu nhiên. nếu bạn chọn "10" thì bạn sẽ nhận được một ví dụ số 10 chữ số ngẫu nhiên.

@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

bây giờ có tất cả các màu sắc của cầu vồng dos

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

Tôi nghĩ rằng điều đó đã bị phá vỡ
A Child of God

-1

Và chỉ hoàn toàn ngẫu nhiên, thiếu thứ tự hoàn toàn: 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.