Comment utiliser aléatoire dans le script BATCH?

103

Comment utiliser aléatoire dans le script BATCH?

IAdapter
la source
1
pourquoi voulez-vous faire cela spécifiquement par lots?
Mat
Il y a un article très intéressant sur SuperUser lié aux nombres aléatoires dans les scripts batch qui mérite d'être référencé ici ...
aschipfl

Réponses:

121

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

mousio
la source
9
Compte tenu du problème spécifique, vous utiliserez très probablement une sorte de boucle? Ensuite, vous devriez en effet utiliser l'expansion retardée, par exemple via SETLOCAL ENABLEDELAYEDEXPANSIONet utiliser à la !RANDOM!place de %RANDOM%, comme Eugene l'a publié.
mousio
14
Une expression plus générale serait %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; juste définir minvalet maxvalaux valeurs appropriées en premier.
mousio
1
Voir aussi la réponse d'
Indiv
55

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

GaryNg
la source
8
Notez que ce ne sera pas distribué uniformément! En prenant l'exemple de 0 ~ 99, les nombres 0 ~ 67 apparaîtront un peu plus souvent que les nombres 68 ~ 99 car 32767 modulo 100 vaut 67 et non 0 comme cela devrait être pour une distribution uniforme. (Ce %random% %%100n'est pas une syntaxe magique mais en fait %random % %% 100avec un espace de moins, où le %%est juste un échappé %qui signifie modulo.)
CherryDT
J'obtiens l'erreur "Opérande manquant" en essayant ceci sur Windows 10. On dirait que vous n'avez besoin que d'un% pour modulo.
Calmarius
19

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_NUMaprè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
indiv
la source
thx, fonctionne bien: si pour / L %% a in (1 1% 3 ') appelez: rand% 1% 2
Ce n'était pas moi
5
@echo off & setLocal EnableDelayedExpansion

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

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

maxest votre maximum et minvotre 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.

calebhk98
la source
3

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.

user3542843
la source
3
Pourquoi utiliseriez 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?
Max Leske
2
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!

Jacob
la source
Sur Windows 10, il donne des nombres de -50 à 49, comme il se doit. A-t-il déjà fait autrement?
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
la source
1
donnez-lui des espaces pour qu'il y ait des lignes, comme @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

simplifié avec plusieurs instructions IF et beaucoup de ((()))

Facile
la source
1

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.

strance
la source
1

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
Kvant
la source
0

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
zask
la source
-1

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
randomisé
la source
Je pense que c'est cassé
Un enfant de Dieu
-1

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
randomisé
la source