¿Cómo se usa al azar en el script BATCH?

¿Cómo se usa al azar en el script BATCH?

%RANDOM% te da un número aleatorio entre 0 y 32767.

Usando una expresión como SET /A test=%RANDOM% * 100 / 32768 + 1 , puede cambiar el rango a cualquier cosa que desee (aquí el rango es [1 … 100] en lugar de [0 … 32767]).

% RANDOM% te da un número aleatorio entre 0 y 32767.

Puedes controlar el rango del número con:

 set /a num=%random% %%100 

– producirá un número entre 0 ~ 99.

Éste:

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

– producirá un número entre 1 ~ 100.

Probablemente desee obtener varios números aleatorios y desee poder especificar un rango diferente para cada uno, por lo que debe definir una función. En mi ejemplo, genero números del 25 al 30 con call:rand 25 30 . Y el resultado está en RAND_NUM después de que esa función finaliza.

 @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! ) 
 set /a number=%random% %% [maximum]-[minimum] 

ejemplo ”

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

dará un número aleatorio entre 100 y 50. ¡Asegúrese de utilizar solo un signo de porcentaje como operando si no está utilizando la línea en un script por lotes!

Podrías hacerlo de esta manera, que no requiere EnableDelayedExpansion

 :choosenamea cls set /a choosemname= %random% if %choosemname% GTR %max% goto choosenameb if %choosemname% LSS %min% goto choosenameb goto gotnamenow 

donde max es tu máximo y min es tu mínimo. Esto es eficiente, pero podría tomar muchas rondas si su scope es demasiado pequeño.

 @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 

Digamos que quieres un número 1-5; podrías usar lo siguiente:

  :LOOP set NUM=%random:~-1,1% if %NUM% GTR 5 ( goto LOOP ) goto NEXT 

O puede usar: ~ 1,1 en lugar de: ~ -1,1. El: ~ -1,1 no es necesario, pero reduce en gran medida la cantidad de tiempo que lleva alcanzar el rango correcto. Digamos que quiere un número del 1 al 50, debemos decidir entre 2 dígitos y 1 dígito. Utilizar:

  :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 

Puede agregar más a este algoritmo para decidir entre rangos grandes, como 1-1000.

 @(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 /AD=%D%+1)ELSE set /AC=%C%+1)&goto Y 

simplificado con múltiples declaraciones IF y un montón de ((()))

Y solo para ser completamente al azar para aquellos que no siempre quieren una pantalla en negro.

 @(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 /AA=%random% %%15 +1&SET /AV=%random% %%15 +1)ELSE set /AC=%C%+1)&goto Y 

Esto cambiará el color de la pantalla; ambos son aleatorios.

Si va a dividir por algún valor grande obtendrá una gran cantidad de duplicados, uno después de otro. Lo que debe hacer es tomar el módulo del valor de% 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 

he aquí un ejemplo que he creado para ti, debería mostrar un cuadro de diálogo en el que se te pide que selecciones un número del 1 al 10, dependiendo del número que selecciones, generará un número aleatorio en un archivo por lotes que hayas nombrado. Si selecciona “1”, obtendrá un número aleatorio de 1 dígito. si selecciona “10”, obtendrá un número aleatorio de 10 dígitos.

 @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 

ahora presenta todos los colores del dos arcoiris

 @(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 /AD=%D%+1) ELSE set /AC=%C%+1)&goto Y 

Y para ser completamente aleatorio, una falta total de orden: SET /AV=%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 /AV=%random% %%15 +1)ELSE set /AC=%C%+1)&goto Y