จะใช้สุ่มใน BATCH script ได้อย่างไร?


104

จะใช้สุ่มใน BATCH script ได้อย่างไร?


1
ทำไมคุณถึงต้องการทำสิ่งนี้เป็นชุดโดยเฉพาะ
จ้า

มีโพสต์ที่น่าสนใจมากเกี่ยวกับ SuperUserที่เกี่ยวข้องกับตัวเลขสุ่มในสคริปต์แบทช์ที่ควรค่าแก่การอ้างอิงที่นี่ ...
aschipfl

คำตอบ:


121

%RANDOM% ให้ตัวเลขสุ่มระหว่าง 0 ถึง 32767

การใช้นิพจน์เช่นSET /A test=%RANDOM% * 100 / 32768 + 1คุณสามารถเปลี่ยนช่วงเป็นอะไรก็ได้ที่คุณต้องการ (ในที่นี้คือช่วง [1 … 100] แทนที่จะเป็น [0 … 32767])


9
เมื่อพิจารณาถึงปัญหาที่เฉพาะเจาะจงคุณมีแนวโน้มที่จะใช้ลูปบางประเภท? จากนั้นคุณควรใช้การขยายแบบล่าช้าเช่นผ่านSETLOCAL ENABLEDELAYEDEXPANSIONและใช้!RANDOM!แทน%RANDOM%เช่นที่ยูจีนโพสต์
mousio

14
นิพจน์ทั่วไปจะเป็น%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; เพียงตั้งค่าminvalและmaxvalเป็นค่าที่เหมาะสมก่อน
mousio


55

% RANDOM% ให้หมายเลขสุ่มระหว่าง 0 ถึง 32767

คุณสามารถควบคุมช่วงของตัวเลขด้วย:

set /a num=%random% %%100

- จะสร้างตัวเลขระหว่าง 0 ~ 99

อันนี้:

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

- จะสร้างหมายเลขระหว่าง 1 ~ 100


8
โปรดทราบว่าสิ่งนี้จะไม่กระจายอย่างสม่ำเสมอ! จากตัวอย่าง 0 ~ 99 ตัวเลข 0 ~ 67 จะเกิดขึ้นบ่อยกว่าตัวเลข 68 ~ 99 เล็กน้อยเนื่องจาก 32767 โมดูโล 100 เป็น 67 และไม่ใช่ 0 เนื่องจากจะต้องมีการแจกแจงแบบสม่ำเสมอ (นี่%random% %%100ไม่ใช่ไวยากรณ์เวทย์มนตร์ แต่จริงๆแล้ว%random % %% 100มีช่องว่างน้อยกว่าหนึ่งช่องโดยที่%%เป็นเพียงค่า Escape %ซึ่งย่อมาจาก modulo)
CherryDT

ฉันได้รับข้อผิดพลาด "Missing operand" เมื่อลองใช้ใน Windows 10 ดูเหมือนว่าคุณต้องการเพียง% singe สำหรับโมดูโล
Calmarius

19

คุณอาจต้องการรับตัวเลขสุ่มหลาย ๆ ตัวและอาจต้องการระบุช่วงที่แตกต่างกันสำหรับแต่ละช่วงดังนั้นคุณควรกำหนดฟังก์ชัน ในตัวอย่างของฉันฉันสร้างตัวเลขตั้งแต่วันที่ 25 ถึงวันที่ 30 call:rand 25 30ด้วย และผลลัพธ์ก็คือRAND_NUMหลังจากออกจากฟังก์ชันนั้น

@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

ขอบคุณทำงานได้ดี: ถ้าสำหรับ / L %% a ใน (1 1% 3 ') โทร: แรนด์% 1% 2
ไม่ใช่ฉัน


4

คุณสามารถทำได้ด้วยวิธีนี้ซึ่งไม่จำเป็นต้องใช้ EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

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

maxค่าสูงสุดของคุณอยู่ที่ไหนและminเป็นค่าต่ำสุดของคุณ วิธีนี้ไม่ค่อยมีประสิทธิภาพเนื่องจากอาจใช้เวลาหลายรอบหากช่วงของคุณเล็กเกินไป นอกจากนี้จะใช้ไม่ได้กับตัวเลขที่ใหญ่กว่า 32767


3

สมมติว่าคุณต้องการหมายเลข 1-5 คุณสามารถใช้สิ่งต่อไปนี้:

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

หรือคุณสามารถใช้: ~ 1,1 แทน: ~ -1,1 ไม่จำเป็นต้องใช้: ~ -1,1 แต่จะช่วยลดระยะเวลาที่ใช้ในการตีช่วงที่ถูกต้องได้มาก สมมติว่าคุณต้องการตัวเลข 1-50 เราต้องตัดสินใจระหว่าง 2 หลักกับ 1 หลัก ใช้:

    :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


3
ทำไมคุณถึงใช้gotoเมื่อคุณมีหนึ่งสมุทรเช่นข้างบน? โซลูชันอื่น ๆ ช่วยให้คุณระบุช่วงได้อย่างชัดเจน ข้อได้เปรียบของรหัสของคุณคืออะไร?
Max Leske

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

ตัวอย่าง "

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

จะให้ตัวเลขสุ่มระหว่าง 100 ถึง 50 อย่าลืมใช้เครื่องหมายเปอร์เซ็นต์เดียวเป็นตัวถูกดำเนินการหากคุณไม่ได้ใช้บรรทัดในสคริปต์ชุดงาน!


ใน Windows 10 จะให้ตัวเลขตั้งแต่ -50 ถึง 49 ตามที่ควร มันเคยทำอย่างอื่นหรือไม่?
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 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

ง่ายขึ้นด้วยคำสั่ง IF หลายคำสั่งและ ((())) มากมาย


1

และเพื่อเป็นการสุ่มอย่างสมบูรณ์สำหรับผู้ที่ไม่ต้องการหน้าจอสีดำเสมอไป

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

สิ่งนี้จะเปลี่ยนสีของหน้าจอและทั้งสองแบบเป็นแบบสุ่ม


1

หากคุณหารด้วยค่าจำนวนมากคุณจะได้รับค่าที่ซ้ำกันจำนวนมาก สิ่งที่คุณต้องทำคือใช้โมดูโลของค่า% 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

นี่คือตัวอย่างที่ฉันสร้างขึ้นสำหรับคุณควรแสดงกล่องโต้ตอบเพื่อขอให้คุณเลือกหมายเลข 1-10 ขึ้นอยู่กับหมายเลขที่คุณเลือกมันจะสร้างตัวอย่างตัวเลขสุ่มไปยังไฟล์แบตช์ที่คุณตั้งชื่อ หากคุณเลือก "1" คุณจะได้ตัวอย่างตัวเลข 1 หลักแบบสุ่ม หากคุณเลือก "10" คุณจะได้รับตัวอย่างตัวเลข 10 หลักแบบสุ่ม

@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

ตอนนี้นำเสนอทุกสีของรุ้งโดส

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

ฉันคิดว่ามันเสีย
ลูกของพระเจ้า

-1

และเพื่อเป็นการสุ่มอย่างสมบูรณ์การขาดคำสั่งทั้งหมด: 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.