Làm thế nào để sử dụng ngẫu nhiên trong tập lệnh BATCH?
Làm thế nào để sử dụng ngẫu nhiên trong tập lệnh BATCH?
Câu trả lời:
%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]).
SETLOCAL ENABLEDELAYEDEXPANSION
và sử dụng !RANDOM!
thay vì %RANDOM%
, như Eugene đã đăng.
%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%
; chỉ cần đặt minval
và maxval
đến các giá trị thích hợp trước.
% 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.
%random% %%100
không phải là cú pháp ma thuật nhưng thực sự %random % %% 100
vớ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.)
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_NUM
sau 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
@echo off & setLocal EnableDelayedExpansion
for /L %%a in (1 1 100) do (
echo !random!
)
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 max
là mức tối đa của bạn và đâu min
là 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.
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.
goto
khi 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ì?
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ô!
@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
@(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 ((()))
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.
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
đâ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
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
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