BATCH komut dosyasında rastgele nasıl kullanılır?
Yanıtlar:
%RANDOM%
0 ile 32767 arasında rastgele bir sayı verir.
Gibi bir ifade kullanarak SET /A test=%RANDOM% * 100 / 32768 + 1
aralığı istediğiniz herhangi bir şeye değiştirebilirsiniz (burada aralık [0… 32767] yerine [1… 100] 'dür).
SETLOCAL ENABLEDELAYEDEXPANSION
ve !RANDOM!
yerine kullanarak gecikmeli genişletmeyi kullanıyor olmalısınız %RANDOM%
.
%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%
; Sadece set minval
ve maxval
öncelikle uygun değerlere.
% RANDOM%, 0 ile 32767 arasında rastgele bir sayı verir.
Numaranın aralığını şu şekilde kontrol edebilirsiniz:
set /a num=%random% %%100
- 0 ~ 99 arasında sayı üretecektir.
Bu:
set /a num=%random% %%100 +1
- 1 ~ 100 arasında sayı üretecektir.
%random% %%100
sihirli sözdizimi ama aslında %random % %% 100
bir eksik alana sahip %%
kaçan bir adildir %
modulo açılımı.)
Muhtemelen birkaç rastgele sayı elde etmek isteyeceksiniz ve her biri için farklı bir aralık belirleyebilmek isteyebilirsiniz, bu nedenle bir işlev tanımlamalısınız. Örneğimde, 25 ile 30 arasında sayılar üretiyorum call:rand 25 30
. Ve sonuç, RAND_NUM
bu fonksiyon çıktıktan sonra gelir.
@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!
)
Bunu gerektirmeyen bu şekilde yapabilirsiniz EnableDelayedExpansion
:choosenamea
cls
set /a choosemname=%random%
if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow
max
maksimum min
değeriniz ve minimum değeriniz nerede . Menziliniz çok küçükse, bu çok verimli değildir. Ayrıca, 32767'den büyük sayılar için bu işe yaramayacaktır.
1-5 arası bir sayı istediğinizi varsayalım; aşağıdakileri kullanabilirsiniz:
:LOOP
set NUM=%random:~-1,1%
if %NUM% GTR 5 (
goto LOOP )
goto NEXT
Veya, ~ -1,1 yerine ~ 1,1 kullanabilirsiniz. : ~ -1,1 gerekli değildir, ancak doğru aralığa ulaşmak için gereken süreyi büyük ölçüde azaltır. Diyelim ki 1-50 arası bir sayı istiyorsunuz, 2 hane ile 1 hane arasında karar vermemiz gerekiyor. Kullanım:
: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 gibi büyük aralıklar arasında karar vermek için bu algoritmaya daha fazlasını ekleyebilirsiniz.
goto
Yukarıdaki gibi bir astarınız varken neden kullanasınız ? Diğer çözümler, aralığı açıkça belirlemenize izin verir. Kodunuzun avantajı nedir?
set /a number=%random% %% [maximum]-[minimum]
misal "
set /a number=%random% %% 100-50
100 ile 50 arasında rastgele bir sayı verecektir. Bir toplu iş komut dosyasında satırı kullanmıyorsanız, işlenen olarak yalnızca bir yüzde işareti kullandığınızdan emin olun!
@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
birden çok EĞER ifadesi ve bol miktarda ((())) ile basitleştirilmiştir
Ve her zaman siyah ekran istemeyenler için tamamen rastgele olmak.
@(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
Bu, ekran rengini değiştirecek ve her ikisi de rastgele.
Büyük bir değere bölerseniz, birbiri ardına çok sayıda kopya elde edersiniz. Yapmanız gereken şey,% RANDOM% değerinden modulo almak:
@echo off
REM
SET maxvalue=10
SET minvalue=1
SETLOCAL
SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
echo "Tmp random: %tmpRandom%"
echo "Random: %RANDOM%"
ENDLOCAL
işte sizin için oluşturduğum bir örnek, seçtiğiniz numaraya bağlı olarak 1-10 arası bir sayı seçmenizi isteyen bir iletişim kutusu göstermeli, adlandırdığınız bir toplu iş dosyasına rastgele bir sayı örneği oluşturacaktır. "1" i seçerseniz, rastgele 1 basamaklı bir sayı örneği alırsınız. "10" u seçerseniz, rastgele 10 basamaklı bir sayı örneği alırsınız.
@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
şimdi dos gökkuşağının tüm renklerini içeriyor
@(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
Ve tamamen rastgele olmak gerekirse, tamamen bir düzen eksikliği: 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