BATCH komut dosyasında rastgele nasıl kullanılır?


Yanıtlar:


121

%RANDOM% 0 ile 32767 arasında rastgele bir sayı verir.

Gibi bir ifade kullanarak SET /A test=%RANDOM% * 100 / 32768 + 1aralığı istediğiniz herhangi bir şeye değiştirebilirsiniz (burada aralık [0… 32767] yerine [1… 100] 'dür).


9
Spesifik problem göz önüne alındığında, büyük olasılıkla bir tür döngü kullanacaksınız? O zaman gerçekten de Eugene'nin gönderdiği gibi, örneğin aracılığıyla SETLOCAL ENABLEDELAYEDEXPANSIONve !RANDOM!yerine kullanarak gecikmeli genişletmeyi kullanıyor olmalısınız %RANDOM%.
mousio

14
Daha genel bir ifade şöyle olacaktır %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; Sadece set minvalve maxvalöncelikle uygun değerlere.
mousio

1
Ayrıca bkz. Birey'in cevabı
mousio

55

% 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.


8
Bunun tek tip olarak dağıtılmayacağını unutmayın! 0 ~ 99 örneğini ele alırsak, 0 ~ 67 sayıları 68 ~ 99 sayılarından biraz daha sık ortaya çıkacaktır çünkü 32767 modulo 100, tekdüze bir dağılım için olması gerektiği gibi 67'dir ve 0 değildir. (Bu %random% %%100sihirli sözdizimi ama aslında %random % %% 100bir eksik alana sahip %%kaçan bir adildir %modulo açılımı.)
CherryDT

Bunu Windows 10'da denerken "Eksik işlenen" hatası alıyorum. Görünüşe göre modulo için sadece bir% şarkıya ihtiyacınız var.
Calmarius

19

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_NUMbu 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

teşekkürler, iyi çalışın: eğer / L %% a içinde (1 %% 3 ') arayın: rand% 1% 2
It Wasn't Me

5
@echo off & setLocal EnableDelayedExpansion

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

4

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

maxmaksimum mindeğ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.


3

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.


3
gotoYukarı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?
Max Leske

2
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!


Windows 10'da olması gerektiği gibi -50'den 49'a kadar sayılar verir. Gerçekten başka türlü yaptı mı?
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
@echo kapalı gibi çizgiler olması için buna biraz boşluk verin
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

birden çok EĞER ifadesi ve bol miktarda ((())) ile basitleştirilmiştir


1

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.


1

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

0

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

-1

ş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

Sanırım bu kırıldı
A Child of God

-1

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.