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 casuale N compreso tra 1 e 26
  • L'istruzione for /f seleziona il N ° 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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow