batch-file
Aleatorio en archivos por lotes
Buscar..
Números al azar
Usando la variable dinámica %Random%
, podemos obtener un entero aleatorio de 0 a 32767. Por ejemplo:
echo %random%
Obviamente, esto devuelve un número entero de 0 a 32767. Pero a veces queremos que esté en un rango específico, digamos de 1 a 100.
Generando números aleatorios dentro de rango específico
El método básico para hacerlo se detalla a continuación.
set /a result=(%RANDOM%*max/32768)+min
donde max
es el número superior que se puede generar, y min
es el número más pequeño que se puede generar. Tenga en cuenta que no obtendrá ningún número decimal porque set /a
redondea automáticamente. Para generar un número aleatorio decimal, intente esto:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Generando números aleatorios mayores que 32767
Si intentas
set /a whole=(%RANDOM%*65536/32768)+1
lo más probable es que obtengas números aleatorios que son impares.
Para generar números más grandes que 32767, aquí hay un método mejor.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
El código anterior extrae el carácter 1 de cada %random%
. Pero esto se hace a propósito.
Dado que el número random
podría ser un número de un dígito, la extracción de los últimos 2 dígitos no funcionará. Por eso solo extraemos el último carácter. En este caso, tenemos un 6 %random:~-1%
, que genera el máximo de 999999
y el mínimo de 000000
; es posible que deba ajustar esto para que se ajuste a sus necesidades.
Pseudoaleatorio
cmd.exe
genera la semilla en función del momento en que se inició la sección de cmd
, por lo que si inicia la sección de mutliple casi al mismo tiempo, es posible que el resultado no sea lo suficientemente aleatorio.
Alfabetos al azar
Desafortunadamente, los lotes no tienen un método incorporado para generar alfabetos, pero al usar %random%
y for
ciclo, podemos 'generar' alfabetos.
Esta es una idea simple de cómo funciona esto.
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
)
- El primer
set /a
declaración genera un número aleatorioN
entre 1 y 26 - La instrucción
for /f
selecciona el elementoN
th de una lista de la A a la Z.- Devolver el resultado
Uno puede poner un total de 31
artículos en 1 for
bucle, y prácticamente artículos ilimitados usando [este método]. ( Lote - para orden de parámetros de bucle
Pseudoaleatorio y uniforme al azar en lote
Distribución pseudoaleatoria
De acuerdo con esta respuesta de desbordamiento de pila , el usuario CherryDT señaló este código:
set /a num=%random% %% 100
No da una distribución uniforme.
La variable dinámica interna %random%
hace da una distribución uniforme, pero el código de seguridad no será un azar uniformado. Este código genera un número aleatorio entre 0 ~ 99, pero el resultado no será uniforme. 0 ~ 67 ocurrirán más de 68 ~ 99 desde 32767 MOD 100
= 67
.
Para generar una distribución aleatoria uniforme usando el código anterior, entonces se debe cambiar 100
. Aquí hay un método para obtener un número que crea una distribución uniforme.
32767 mod (32767 / n)
donde n
es un número entero, entre 0 ~ 32767, el resultado puede ser decimal y puede no funcionar por lotes.
Distribución uniforme
set /a result=(%RANDOM%*100/32768)+1
Este método generará una distribución uniforme. Evita el uso de %
, que es más como "resto" y luego "módulo" en un script por lotes. Sin usar %
, el resultado será uniforme.
Alternativamente, aquí hay un método ineficiente, pero 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.
)
)
Cambie [yourMinNumber]
y [yourMaxNumber]
acuerdo con sus propios valores.