Wie verwende ich Zufall in BATCH-Skript?
Wie verwende ich Zufall in BATCH-Skript?
Antworten:
%RANDOM%
gibt Ihnen eine Zufallszahl zwischen 0 und 32767.
Mit einem Ausdruck wie SET /A test=%RANDOM% * 100 / 32768 + 1
können Sie den Bereich nach Belieben ändern (hier ist der Bereich [1… 100] anstelle von [0… 32767]).
SETLOCAL ENABLEDELAYEDEXPANSION
und !RANDOM!
anstelle von %RANDOM%
, wie Eugene geschrieben hat.
%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%
; nur festgelegt minval
und maxval
auf die entsprechenden Werte zuerst.
% RANDOM% gibt Ihnen eine Zufallszahl zwischen 0 und 32767.
Sie können den Nummernbereich steuern mit:
set /a num=%random% %%100
- erzeugt eine Zahl zwischen 0 und 99.
Dieses:
set /a num=%random% %%100 +1
- erzeugt eine Zahl zwischen 1 ~ 100.
%random% %%100
ist keine magische Syntax, sondern tatsächlich %random % %% 100
mit einem Leerzeichen weniger, wobei das %%
nur ein %
Möglicherweise möchten Sie mehrere Zufallszahlen erhalten und möchten möglicherweise für jeden einen anderen Bereich angeben. Daher sollten Sie eine Funktion definieren. In meinem Beispiel generiere ich Zahlen von 25 bis 30 mit call:rand 25 30
. Und das Ergebnis ist in, RAND_NUM
nachdem diese Funktion beendet wurde.
@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!
)
Sie könnten es auf diese Weise tun, was nicht erforderlich ist EnableDelayedExpansion
:choosenamea
cls
set /a choosemname=%random%
if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow
Wo ist dein Maximum max
und wo min
ist dein Minimum? Dies ist nicht sehr effizient, da es viele Runden dauern kann, wenn Ihre Reichweite zu klein ist. Dies funktioniert auch nicht für Zahlen größer als 32767.
Angenommen, Sie möchten eine Nummer 1-5. Sie könnten Folgendes verwenden:
:LOOP
set NUM=%random:~-1,1%
if %NUM% GTR 5 (
goto LOOP )
goto NEXT
Oder Sie könnten verwenden: ~ 1,1 anstelle von: ~ -1,1. Das: ~ -1,1 wird nicht benötigt, reduziert jedoch die Zeit, die benötigt wird, um den richtigen Bereich zu erreichen, erheblich. Angenommen, Sie möchten eine Zahl von 1 bis 50, wir müssen uns zwischen zwei und einer Stelle entscheiden. Verwenden:
: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
Sie können diesem Algorithmus weitere hinzufügen, um zwischen großen Bereichen wie 1-1000 zu wählen.
goto
wenn Sie einen Liner wie oben haben können? Mit anderen Lösungen können Sie den Bereich explizit angeben. Was ist der Vorteil Ihres Codes?
set /a number=%random% %% [maximum]-[minimum]
Beispiel "
set /a number=%random% %% 100-50
gibt eine Zufallszahl zwischen 100 und 50 an. Verwenden Sie nur ein Prozentzeichen als Operanden, wenn Sie die Zeile nicht in einem Batch-Skript verwenden!
@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
vereinfacht mit mehreren IF-Anweisungen und viel ((()))
Und nur um für diejenigen, die nicht immer einen schwarzen Bildschirm wollen, völlig zufällig zu sein.
@(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
Dadurch ändert sich die Bildschirmfarbe. Beide sind zufällig.
Wenn Sie durch einen großen Wert dividieren, erhalten Sie nacheinander eine große Anzahl von Duplikaten. Was Sie tun müssen, ist Modulo des% RANDOM% -Wertes zu nehmen:
@echo off
REM
SET maxvalue=10
SET minvalue=1
SETLOCAL
SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
echo "Tmp random: %tmpRandom%"
echo "Random: %RANDOM%"
ENDLOCAL
Hier ist ein Beispiel, das ich für Sie erstellt habe. Es sollte ein Dialogfeld angezeigt werden, in dem Sie aufgefordert werden, eine Zahl von 1 bis 10 auszuwählen. Abhängig von der von Ihnen ausgewählten Zahl wird ein Zufallszahlenbeispiel für eine von Ihnen benannte Batchdatei generiert. Wenn Sie "1" auswählen, erhalten Sie ein Beispiel für eine zufällige 1-stellige Zahl. Wenn Sie "10" auswählen, erhalten Sie ein Beispiel für eine zufällige 10-stellige Zahl.
@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
Jetzt mit allen Farben des Dos Regenbogens
@(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
Und um ganz zufällig zu sein, ein völliger Mangel an Ordnung: 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