Come utilizzare casuale nello script BATCH?


Risposte:


121

%RANDOM% ti dà un numero casuale compreso tra 0 e 32767.

Usando un'espressione come SET /A test=%RANDOM% * 100 / 32768 + 1, puoi cambiare l'intervallo in qualsiasi cosa desideri (qui l'intervallo è [1… 100] invece di [0… 32767]).


9
Dato il problema specifico, molto probabilmente utilizzerai una sorta di loop? Quindi dovresti effettivamente usare l'espansione ritardata, ad esempio tramite SETLOCAL ENABLEDELAYEDEXPANSIONe utilizzare !RANDOM!invece di %RANDOM%, come ha postato Eugene.
mousio

14
Un'espressione più generale sarebbe %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; impostare prima minvale maxvalsui valori appropriati.
mousio

1
Vedi anche la risposta di
indiv

55

% RANDOM% ti dà un numero casuale compreso tra 0 e 32767.

Puoi controllare l'intervallo del numero con:

set /a num=%random% %%100

- produrrà un numero compreso tra 0 e 99.

Questo:

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

- produrrà un numero compreso tra 1 e 100.


8
Nota che questo non sarà distribuito uniformemente! Prendendo l'esempio 0 ~ 99, i numeri 0 ~ 67 si verificheranno leggermente più spesso dei numeri 68 ~ 99 perché 32767 modulo 100 è 67 e non 0 come dovrebbe essere per una distribuzione uniforme. (Questa %random% %%100non è una sintassi magica ma in realtà %random % %% 100con uno spazio in meno, dove %%è solo un sfuggito %che sta per modulo.)
CherryDT

Ricevo l'errore "Operando mancante" quando lo provo su Windows 10. Sembra che tu abbia bisogno di un solo% per modulo.
Calmarius

19

Probabilmente vorrai ottenere diversi numeri casuali e potresti voler essere in grado di specificare un intervallo diverso per ciascuno, quindi dovresti definire una funzione. Nel mio esempio, genero numeri da 25 a 30 con call:rand 25 30. E il risultato è RAND_NUMdopo che la funzione è terminata.

@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

grazie, funziona bene: se per / L %% a in (1 1% 3 ') chiama: rand% 1% 2
Non ero io

5
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)

4

Potresti farlo in questo modo, che non richiede EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

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

dov'è il maxtuo massimo ed minè il tuo minimo. Questo non è molto efficiente poiché potrebbe richiedere molti round se il raggio d'azione è troppo piccolo. Inoltre, questo non funzionerà per i numeri maggiori di 32767.


3

Supponiamo che tu voglia un numero 1-5; potresti usare quanto segue:

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

Oppure potresti usare: ~ 1,1 al posto di: ~ -1,1. Il: ~ -1,1 non è necessario, ma riduce notevolmente il tempo necessario per raggiungere la giusta distanza. Supponiamo che tu voglia un numero 1-50, dobbiamo decidere tra 2 cifre e 1 cifra. Uso:

    :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

Puoi aggiungere altro a questo algoritmo per decidere tra intervalli ampi, ad esempio 1-1000.


3
Perché dovresti usare gotoquando puoi avere una riga come sopra? Altre soluzioni consentono di specificare esplicitamente l'intervallo. Qual è il vantaggio del tuo codice?
Max Leske

2
set /a number=%random% %% [maximum]-[minimum]

esempio "

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

darà un numero casuale tra 100 e 50. Assicurati di usare solo un segno di percentuale come operando se non stai usando la linea in uno script batch!


Su Windows 10 fornisce numeri da -50 a 49, come dovrebbe. Ha mai fatto davvero diversamente?
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

1
dagli alcuni spazi in modo che abbia delle righe, come @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

semplificato con più istruzioni IF e abbondanza di ((()))


1

E giusto per essere completamente casuale per coloro che non vogliono sempre uno schermo nero.

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

Questo cambierà il colore dello schermo anche entrambi sono casuali.


1

Se dividi per un valore elevato, otterrai una quantità enorme di duplicati uno dopo l'altro. Quello che devi fare è prendere il modulo del valore% 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

0

ecco un esempio che ho creato per te, dovrebbe visualizzare una finestra di dialogo che ti chiede di selezionare un numero 1-10, a seconda del numero selezionato, genererà un esempio di numero casuale in un file batch che hai nominato. Se selezioni "1", otterrai un esempio di numero casuale di 1 cifra. se selezioni "10", otterrai un esempio di numero casuale di 10 cifre.

@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

-1

ora con tutti i colori dell'arcobaleno 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

Penso che sia rotto
Un figlio di Dio

-1

E giusto per essere del tutto casuale, una totale mancanza di ordine: 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.