batch-file
Casuale nei file batch
Ricerca…
Numeri casuali
Usando la variabile dinamica %Random%
, possiamo ottenere un numero intero casuale compreso tra 0 e 32767. Ad esempio:
echo %random%
Ovviamente, restituisce un numero intero compreso tra 0 e 32767. Ma a volte vogliamo che si trovi in un intervallo specifico, ad esempio da 1 a 100.
Generazione di numeri casuali all'interno di un intervallo specifico
Il metodo di base per farlo è elencato di seguito.
set /a result=(%RANDOM%*max/32768)+min
dove max
è il numero più alto che può essere generato e min
è il numero più piccolo che può essere generato. Si noti che non si otterranno numeri decimali perché si set /a
arrotondamento verso il basso automaticamente. Per generare un numero casuale decimale, prova questo:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Generare numeri casuali superiori a 32767
Se provi
set /a whole=(%RANDOM%*65536/32768)+1
molto probabilmente otterrai numeri casuali che sono dispari.
Per generare numeri maggiori di 32767, ecco un metodo migliore.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Il codice precedente estrae il 1 carattere da ogni %random%
. Ma questo è fatto apposta.
Poiché il numero random
potrebbe essere un numero di cifre, l'estrazione delle ultime 2 cifre non funzionerà. Ecco perché estraiamo solo l'ultimo carattere. In questo caso, abbiamo il 6 %random:~-1%
, generando il massimo di 999999
e il minimo a 000000
, potrebbe essere necessario regolarlo in base alle proprie esigenze.
pseudocasuale
cmd.exe
genera il seme in base al momento in cui è iniziata la sezione cmd
, quindi se si avvia la sezione mutliple quasi alla stessa ora, il risultato potrebbe non essere abbastanza "casuale".
Alfabeti casuali
Sfortunatamente, batch non ha un metodo integrato per generare alfabeti, ma usando %random%
e for
loop, possiamo 'generare' alfabeti.
Questa è una semplice idea di come funziona.
set /a result=(%random%*26/32768)+1
for /f "tokens=%result%" %%I in ("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do (
echo %%I
)
- Il primo
set /a
istruzione genera un numero casualeN
compreso tra 1 e 26 - L'istruzione
for /f
seleziona ilN
° elemento da un elenco di A a Z.- Restituisce il risultato
È possibile inserire un totale di 31
articoli in un ciclo for
1, e oggetti praticamente illimitati usando [questo metodo]. ( Ordine dei parametri del ciclo Batch - for
Pseudocasuale e uniforme casuale nel lotto
Distribuzione pseudocasuale
Accertando a questa risposta di Overflow dello stack , l'utente CherryDT ha sottolineato questo codice:
set /a num=%random% %% 100
non dà una distribuzione uniforme.
La variabile dinamica interna %random%
non dà una distribuzione uniforme, ma il codice di cui sopra non sarà un casuale uniforme. Questo codice genera un numero casuale compreso tra 0 e 99, ma il risultato non sarà uniforme. 0 ~ 67 si verificherà più di 68 ~ 99 dal 32767 MOD 100
= 67
.
Per generare un casuale distribuito uniforme usando il codice sopra, allora 100
deve essere cambiato. Ecco un metodo per ottenere un numero che crea una distribuzione uniforme.
32767 mod (32767 / n)
dove n
è un numero intero compreso tra 0 ~ 32767, il risultato può essere decimale e potrebbe non funzionare in batch.
Distribuzione uniforme
set /a result=(%RANDOM%*100/32768)+1
Questo metodo genererà una distribuzione uniforme. Evita l'uso di %
, che è più simile a "resto" e quindi a "modulo" in uno script batch. Senza usare %
, il risultato sarà uniforme.
In alternativa, ecco un metodo inefficiente, ma uniforme.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Modificare [yourMinNumber]
e [yourMaxNumber]
base ai propri valori.