Wie verwende ich Zufall in BATCH-Skript?

103

Wie verwende ich Zufall in BATCH-Skript?

IAdapter
quelle
1
Warum möchten Sie dies speziell im Batch tun?
Mat
Es gibt einen sehr interessanten Beitrag auf SuperUser, der sich auf Zufallszahlen in Batch-Skripten bezieht, auf die hier verwiesen werden sollte ...
aschipfl

Antworten:

121

%RANDOM% gibt Ihnen eine Zufallszahl zwischen 0 und 32767.

Mit einem Ausdruck wie SET /A test=%RANDOM% * 100 / 32768 + 1können Sie den Bereich nach Belieben ändern (hier ist der Bereich [1… 100] anstelle von [0… 32767]).

mousio
quelle
9
Angesichts des spezifischen Problems werden Sie sehr wahrscheinlich eine Art Schleife verwenden? Dann sollten Sie in der Tat eine verzögerte Erweiterung verwenden, z. B. über SETLOCAL ENABLEDELAYEDEXPANSIONund !RANDOM!anstelle von %RANDOM%, wie Eugene geschrieben hat.
Mousio
14
Ein allgemeinerer Ausdruck wäre %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; nur festgelegt minvalund maxvalauf die entsprechenden Werte zuerst.
Maus
1
Siehe auch die Antwort von
indiv
55

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

GaryNg
quelle
8
Beachten Sie, dass dies nicht gleichmäßig verteilt wird! Am Beispiel 0 ~ 99 treten die Zahlen 0 ~ 67 etwas häufiger auf als die Zahlen 68 ~ 99, da 32767 modulo 100 67 und nicht 0 ist, wie es für eine gleichmäßige Verteilung erforderlich wäre. (Dies %random% %%100ist keine magische Syntax, sondern tatsächlich %random % %% 100mit einem Leerzeichen weniger, wobei das %%nur ein %
Escape
Beim Versuch unter Windows 10 wird der Fehler "Fehlender Operand" angezeigt. Sie benötigen anscheinend nur einen einzigen% für Modulo.
Calmarius
19

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_NUMnachdem 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
indiv
quelle
thx, arbeite gut: wenn für / L %% a in (1 1% 3 ') anrufe: rand% 1% 2
Ich war es nicht
5
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)
Evgeny Gavrin
quelle
4

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 maxund wo minist 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.

calebhk98
quelle
3

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.

user3542843
quelle
3
Warum sollten Sie verwenden, gotowenn 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?
Max Leske
2
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!

Jacob
quelle
Unter Windows 10 gibt es Zahlen von -50 bis 49, wie es sollte. Hat es jemals wirklich etwas anderes gemacht?
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
Sinji58
quelle
1
Geben Sie diesem einige Leerzeichen, damit es Linien enthält, wie @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

vereinfacht mit mehreren IF-Anweisungen und viel ((()))

einfach
quelle
1

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.

Kraft
quelle
1

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
Kvant
quelle
0

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
zask
quelle
-1

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
zufällig
quelle
Ich denke, das ist kaputt
Ein Kind Gottes
-1

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
zufällig
quelle