Bagaimana cara menggunakan acak dalam skrip BATCH?


Jawaban:


121

%RANDOM% memberi Anda nomor acak antara 0 dan 32767.

Menggunakan ekspresi seperti SET /A test=%RANDOM% * 100 / 32768 + 1, Anda dapat mengubah rentang menjadi apa pun yang Anda suka (di sini kisarannya adalah [1… 100] bukan [0… 32767]).


9
Mengingat masalah khusus, Anda kemungkinan besar akan menggunakan semacam loop? Maka Anda memang harus menggunakan ekspansi tertunda misalnya melalui SETLOCAL ENABLEDELAYEDEXPANSIONdan menggunakan !RANDOM!alih-alih %RANDOM%, seperti yang diposting Eugene.
mousio

14
Ekspresi yang lebih umum adalah %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; atur saja minvaldan maxvalke nilai yang sesuai terlebih dahulu.
mousio

1
Lihat juga jawaban
indiv

55

% RANDOM% memberi Anda nomor acak antara 0 dan 32767.

Anda dapat mengontrol rentang nomor dengan:

set /a num=%random% %%100

- akan menghasilkan angka antara 0 ~ 99.

Yang ini:

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

- akan menghasilkan angka antara 1 ~ 100.


8
Perhatikan bahwa ini tidak akan didistribusikan secara seragam! Mengambil contoh 0 ~ 99, angka 0 ~ 67 akan muncul sedikit lebih sering daripada angka 68 ~ 99 karena 32767 modulo 100 adalah 67 dan bukan 0 karena harus untuk distribusi seragam. (Ini %random% %%100bukan sintaks ajaib tetapi sebenarnya %random % %% 100dengan satu ruang yang lebih sedikit, di mana %%hanya sebuah pelarian %yang merupakan singkatan dari modulo.)
CherryDT

Saya mendapatkan kesalahan "Operator hilang" saat mencoba ini di Windows 10. Sepertinya Anda hanya perlu% singe untuk modulo.
Calmarius

19

Anda mungkin ingin mendapatkan beberapa nomor acak, dan mungkin ingin menentukan rentang yang berbeda untuk masing-masing nomor, jadi Anda harus menentukan fungsi. Dalam contoh saya, saya menghasilkan angka dari 25 hingga 30 dengan call:rand 25 30. Dan hasilnya adalah RAND_NUMsetelah fungsi itu keluar.

@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, work nice: if for / L %% a in (1 1% 3 ') do call: rand% 1% 2
It Wasn't Me

5
@echo off & setLocal EnableDelayedExpansion

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

4

Anda bisa melakukannya dengan cara ini, yang tidak mengharuskan EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

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

dimana maxmax Anda dan minminimum Anda. Ini tidak terlalu efisien karena mungkin membutuhkan banyak putaran jika jangkauan Anda terlalu kecil. Selain itu, ini tidak akan berfungsi untuk angka yang lebih besar dari 32767.


3

Misalkan Anda menginginkan angka 1-5; Anda bisa menggunakan yang berikut ini:

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

Atau Anda bisa menggunakan: ~ 1,1 sebagai ganti: ~ -1,1. : ~ -1,1 tidak diperlukan, tetapi sangat mengurangi jumlah waktu yang dibutuhkan untuk mencapai kisaran yang tepat. Misalkan Anda menginginkan angka 1-50, kita perlu menentukan antara 2 digit dan 1 digit. Menggunakan:

    :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

Anda dapat menambahkan lebih banyak ke algoritme ini untuk memutuskan antara rentang besar, seperti 1-1000.


3
Mengapa Anda menggunakan gotojika Anda dapat memiliki satu liner seperti di atas? Solusi lain memungkinkan Anda menentukan rentang secara eksplisit. Apa keuntungan dari kode Anda?
Max Leske

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

contoh "

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

akan memberikan nomor acak antara 100 dan 50. Pastikan untuk hanya menggunakan satu tanda persentase sebagai operan jika Anda tidak menggunakan baris dalam skrip batch!


Pada Windows 10 ini memberikan angka dari -50 hingga 49, sebagaimana mestinya. Apakah itu pernah benar-benar melakukan sebaliknya?
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
berikan ini beberapa spasi sehingga ada baris, seperti @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

disederhanakan dengan beberapa pernyataan IF dan banyak ((()))


1

Dan untuk benar-benar acak bagi mereka yang tidak selalu menginginkan layar hitam.

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

Ini akan mengubah warna layar juga keduanya acak.


1

Jika Anda akan membagi dengan beberapa nilai besar, Anda akan mendapatkan sejumlah besar duplikat satu demi satu. Yang perlu Anda lakukan adalah mengambil modulo dari nilai% 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

berikut adalah contoh yang saya buat untuk Anda, ini akan menampilkan dialog yang meminta Anda untuk memilih nomor 1-10, tergantung pada nomor yang Anda pilih, itu akan menghasilkan contoh nomor acak ke file batch yang Anda beri nama. Jika Anda memilih "1" maka Anda akan mendapatkan contoh angka 1 digit acak. jika Anda memilih "10" maka Anda akan mendapatkan contoh angka 10 digit acak.

@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

sekarang menampilkan semua warna pelangi 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

Saya pikir itu rusak
Seorang Anak Allah

-1

Dan agar benar-benar acak, tidak ada urutan sama sekali: 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.