BATCH स्क्रिप्ट में यादृच्छिक का उपयोग कैसे करें?


103

BATCH स्क्रिप्ट में यादृच्छिक का उपयोग कैसे करें?


1
आप ऐसा विशेष रूप से बैच में क्यों करना चाहते हैं?
Mat

SuperUser पर एक बहुत ही दिलचस्प पोस्ट बैच स्क्रिप्ट में यादृच्छिक संख्याओं से संबंधित है जिसे यहाँ संदर्भित किया जा रहा है ...
asipipfl

जवाबों:


121

%RANDOM% आपको 0 और 32767 के बीच एक यादृच्छिक संख्या देता है।

जैसे एक अभिव्यक्ति का उपयोग करके SET /A test=%RANDOM% * 100 / 32768 + 1, आप अपनी पसंद की किसी भी सीमा को बदल सकते हैं (यहाँ [1… 1007] के बजाय [1… 1007]] है।


9
विशिष्ट समस्या को देखते हुए, आप किसी प्रकार के लूप का उपयोग करने की संभावना करेंगे? तो फिर आप यूजीन पोस्ट की तरह देरी से विस्तार SETLOCAL ENABLEDELAYEDEXPANSIONका उपयोग कर रहे हैं और !RANDOM!इसके बजाय का उपयोग करना चाहिए %RANDOM%
मूसियो

14
एक अधिक सामान्य अभिव्यक्ति होगी %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; बस पहले उचित मूल्यों पर सेट minvalऔर maxval
मूसियो

1
Indiv

55

% RANDOM% आपको 0 और 32767 के बीच एक यादृच्छिक संख्या देता है।

आप संख्या की सीमा को इसके साथ नियंत्रित कर सकते हैं:

set /a num=%random% %%100

- 0 ~ 99 के बीच संख्या का उत्पादन करेगा।

यह वाला:

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

- 1 ~ 100 के बीच संख्या का उत्पादन करेगा।


8
ध्यान दें कि यह समान रूप से वितरित नहीं किया जाएगा! 0 ~ 99 उदाहरण लेते हुए, संख्याएँ ~ ~ 67 संख्या 68 ~ 99 की तुलना में थोड़ी अधिक बार होंगी क्योंकि 32767 modulo 100 67 है और 0 नहीं है क्योंकि यह एक समान वितरण के लिए होगा। (यह %random% %%100कोई जादू सिंटैक्स नहीं है, लेकिन वास्तव %random % %% 100में एक कम जगह के साथ, जहां %%सिर्फ एक बच गया है %जो
मोडुलो

विंडोज 10. पर इसे आजमाते समय मुझे "मिसिंग ऑपरेंड" त्रुटि मिल रही है। ऐसा लगता है कि आपको मॉडुलो के लिए सिर्फ एक%% की आवश्यकता है।
कैलमेरियस

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

thx, अच्छा काम करें: अगर / L %% a (1 1% 3 ') के लिए कॉल करें: rand% 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जब आप ऊपर जैसा एक लाइनर लगा सकते हैं तो आप क्यों इस्तेमाल करेंगे ? अन्य समाधान आपको स्पष्ट रूप से सीमा निर्दिष्ट करने देते हैं। आपके कोड का क्या फायदा है?
मैक्स लेसके

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

उदाहरण "

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

100 और 50 के बीच एक यादृच्छिक संख्या देगा। यदि आप एक बैच स्क्रिप्ट में लाइन का उपयोग नहीं कर रहे हैं, तो केवल एक प्रतिशत संकेत का उपयोग ऑपरेंड के रूप में करें!


विंडोज 10 पर यह -50 से 49 तक संख्या देता है, जैसा कि इसे होना चाहिए। क्या यह वास्तव में अन्यथा किया गया था?
किल्वेस76

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

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.