Comment utiliser aléatoire dans le script BATCH?

Comment utiliser random dans un script BATCH?

85
demandé sur IAdapter 2011-04-25 14:18:58

14 réponses

%RANDOM% vous donne un nombre aléatoire entre 0 et 32767.

En utilisant une expression comme SET /A test=%RANDOM% * 100 / 32768 + 1, vous pouvez changer la plage à ce que vous voulez (ici, la plage est [1 ... 100] au lieu de [0 ... 32767]).

99
répondu mousio 2011-04-25 10:46:14

% RANDOM% vous donne un nombre aléatoire entre 0 et 32767.

Vous pouvez contrôler la plage du nombre avec:

set /a num=%random% %%100

- va produire nombre entre 0 ~ 99.

Celui-ci:

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

- produira le nombre entre 1 ~ 100.

44
répondu GaryNg 2014-06-05 13:26:53

, Vous voudrez probablement obtenir plusieurs nombres aléatoires, et veulent être en mesure de spécifier une plage différente pour chacun, alors vous devez 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 dans 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
13
répondu indiv 2011-04-28 18:50:38
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)
4
répondu Evgeny Gavrin 2011-04-25 10:21:34
set /a number=%random% %% [maximum]-[minimum]

Exemple "

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

Donnera un nombre aléatoire entre 100 et 50. Assurez-vous d'utiliser un seul signe de pourcentage comme opérande si vous n'utilisez pas la ligne dans un script batch!

3
répondu Jacob 2013-07-14 12:45:52

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

max est votre max et min est votre minimum. Ce n'est pas très efficace car peut prendre beaucoup de tours si votre portée est trop petit. En outre, cela ne fonctionnera pas pour les nombres supérieurs à 32767.

3
répondu calebhk98 2018-09-17 20:55:56
@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
2
répondu Sinji58 2014-02-25 12:14:47

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 qu'il faut pour atteindre la bonne plage. Disons que vous voulez un nombre 1-50, nous devons décider 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 décider entre de grandes plages, telles que 1-1000.

2
répondu user3542843 2014-04-16 20:19:08
@(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 ((()))

1
répondu simple 2014-12-27 07:19:45

Et juste pour être complètement aléatoire pour ceux qui ne veulent toujours 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 va changer la couleur de l'écran aussi les deux sont aléatoires.

1
répondu strance 2017-08-06 13:43:30

Si vous divisez par certains de grande valeur, vous obtiendrez une énorme quantité de doublons, l'un après l'autre. 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
1
répondu Kvant 2018-05-14 13:35:27

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 va générer un exemple de nombre aléatoire dans un fichier batch que vous avez nommé. Si vous sélectionnez "1", vous obtiendrez un exemple aléatoire de numéro à 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
0
répondu zask 2016-01-25 18:18:30

Maintenant avec toutes les couleurs de l'arc-en-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
-1
répondu randomized 2014-12-29 06:04:23

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
-1
répondu randomized 2017-08-06 16:36:05