¿Cómo usar aleatorio en el script BATCH?

Respuestas:

121

%RANDOM% le 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 lo que quiera (aquí el rango es [1… 100] en lugar de [0… 32767]).

mousio
fuente
9
Dado el problema específico, es muy probable que esté utilizando algún tipo de bucle. Entonces debería estar usando la expansión retrasada, por ejemplo, a través SETLOCAL ENABLEDELAYEDEXPANSIONy usando en !RANDOM!lugar de %RANDOM%, como publicó Eugene.
mousio
14
Una expresión más general sería %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; simplemente configure minvaly maxvalprimero los valores apropiados.
mousio
1
Vea también la respuesta de indiv
mousio
55

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

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

GaryNg
fuente
8
Tenga en cuenta que esto no se distribuirá uniformemente. Tomando el ejemplo 0 ~ 99, los números 0 ~ 67 aparecerán un poco más a menudo que los números 68 ~ 99 porque 32767 módulo 100 es 67 y no 0 como debería ser para una distribución uniforme. (Esta %random% %%100no es una sintaxis mágica, sino en realidad %random % %% 100con un espacio menos, donde %%es solo un escape %que significa módulo).
CherryDT
Recibo el error "Falta operando" al intentar esto en Windows 10. Parece que solo necesita un solo% para el módulo.
Calmarius
19

Probablemente desee obtener varios números aleatorios y es posible que 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_NUMdespués de que la función sale.

@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
fuente
gracias, funciona bien: si para / L %% a en (1 1% 3 ') llame: rand% 1% 2
No era yo
5
@echo off & setLocal EnableDelayedExpansion

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

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

:choosenamea
cls
set /a choosemname=%random%

if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow

¿Dónde maxestá tu máximo y mintu mínimo? Esto no es muy eficiente, ya que podría tomar muchas rondas si su rango es demasiado pequeño. Además, esto no funcionará para números superiores a 32767.

calebhk98
fuente
3

Digamos que quieres un número del 1 al 5; podría utilizar 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 se tarda en alcanzar el rango correcto. Digamos que quieres un número del 1 al 50, necesitamos 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.

usuario3542843
fuente
3
¿Por qué usarías gotocuando puedes tener una línea como la anterior? Otras soluciones le permiten especificar explícitamente el rango. ¿Cuál es la ventaja de su código?
Max Leske
2
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 usar solo un signo de porcentaje como operando si no está usando la línea en un script por lotes!

Jacob
fuente
En Windows 10, da números de -50 a 49, como debería. ¿Realmente alguna vez hizo lo contrario?
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
fuente
1
dale algunos espacios para que tenga líneas, como @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

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

sencillo
fuente
1

Y solo para ser completamente aleatorio para aquellos que no siempre quieren una pantalla negra.

@(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

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

strance
fuente
1

Si divide por un valor grande, obtendrá una gran cantidad de duplicados uno tras otro. Lo que debe hacer es tomar el módulo del valor% 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
fuente
0

aquí hay un ejemplo que creé para usted, debería mostrar un cuadro de diálogo pidiéndole que seleccione un número del 1 al 10, dependiendo del número que seleccione, generará un ejemplo de número aleatorio en un archivo por lotes que nombró. Si selecciona "1", obtendrá un ejemplo de número aleatorio de 1 dígito. si selecciona "10", obtendrá un ejemplo de 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
zask
fuente
-1

ahora con todos los colores del arcoíris 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
aleatorizado
fuente
Creo que está roto
Un hijo de Dios
-1

Y para ser completamente aleatorio, una falta total de orden: 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
aleatorizado
fuente