Comment utiliser aléatoire dans le script BATCH?
Comment utiliser aléatoire dans le script BATCH?
Réponses:
%RANDOM%
vous donne un nombre aléatoire compris entre 0 et 32767.
En utilisant une expression comme SET /A test=%RANDOM% * 100 / 32768 + 1
, vous pouvez changer la plage en ce que vous voulez (ici la plage est [1… 100] au lieu de [0… 32767]).
SETLOCAL ENABLEDELAYEDEXPANSION
et utiliser à la !RANDOM!
place de %RANDOM%
, comme Eugene l'a publié.
%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%
; juste définir minval
et maxval
aux valeurs appropriées en premier.
% RANDOM% vous donne un nombre aléatoire entre 0 et 32767.
Vous pouvez contrôler la plage de numéros avec:
set /a num=%random% %%100
- produira un nombre entre 0 ~ 99.
Celui-là:
set /a num=%random% %%100 +1
- produira un nombre entre 1 ~ 100.
%random% %%100
n'est pas une syntaxe magique mais en fait %random % %% 100
avec un espace de moins, où le %%
est juste un échappé %
qui signifie modulo.)
Vous voudrez probablement obtenir plusieurs nombres aléatoires, et vous voudrez peut-être être en mesure de spécifier une plage différente pour chacun, vous devez donc définir une fonction. Dans mon exemple, je génère des nombres de 25 à 30 avec call:rand 25 30
. Et le résultat est RAND_NUM
après la sortie de cette fonction.
@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!
)
Vous pouvez le faire de cette façon, ce qui ne nécessite pas EnableDelayedExpansion
:choosenamea
cls
set /a choosemname=%random%
if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow
où max
est votre maximum et min
votre minimum. Ce n'est pas très efficace car cela peut prendre beaucoup de tours si votre portée est trop petite. En outre, cela ne fonctionnera pas pour les nombres supérieurs à 32767.
Disons que vous voulez un nombre 1-5; vous pouvez utiliser ce qui suit:
:LOOP
set NUM=%random:~-1,1%
if %NUM% GTR 5 (
goto LOOP )
goto NEXT
Ou vous pouvez utiliser: ~ 1,1 à la place de: ~ -1,1. Le: ~ -1,1 n'est pas nécessaire, mais il réduit considérablement le temps nécessaire pour atteindre la bonne plage. Disons que vous voulez un nombre 1-50, nous devons choisir entre 2 chiffres et 1 chiffre. Utilisation:
: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
Vous pouvez ajouter plus à cet algorithme pour choisir entre de grandes plages, telles que 1-1000.
goto
-vous quand vous pouvez avoir une doublure comme ci-dessus? D'autres solutions vous permettent de spécifier explicitement la plage. Quel est l'avantage de votre code?
set /a number=%random% %% [maximum]-[minimum]
exemple "
set /a number=%random% %% 100-50
donnera un nombre aléatoire entre 100 et 50. Veillez à n'utiliser qu'un seul signe de pourcentage comme opérande si vous n'utilisez pas la ligne dans un script batch!
@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
simplifié avec plusieurs instructions IF et beaucoup de ((()))
Et juste pour être complètement aléatoire pour ceux qui ne veulent pas toujours d'un écran noir.
@(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
Cela changera la couleur de l'écran et les deux sont aléatoires.
Si vous divisez par une grande valeur, vous obtiendrez une énorme quantité de doublons les uns après les autres. Ce que vous devez faire est de prendre modulo de la valeur% 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
voici un exemple que j'ai créé pour vous, il devrait afficher une boîte de dialogue vous demandant de sélectionner un nombre 1-10, en fonction du nombre que vous sélectionnez, il générera un exemple de nombre aléatoire dans un fichier batch que vous avez nommé. Si vous sélectionnez "1", vous obtiendrez un exemple de numéro aléatoire à 1 chiffre. si vous sélectionnez "10", vous obtiendrez un exemple de numéro aléatoire à 10 chiffres.
@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
maintenant avec toutes les couleurs de l'arc-en-ciel 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
Et juste pour être complètement aléatoire, un manque total d'ordre: 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