batch-file-es Windows

carlos.wilber.franco
from carlos.wilber.franco More from this publisher
08.02.2022 Views

Capítulo 2: Aleatorio en archivos por lotesExamplesNúmeros al azarUsando la variable dinámica %Random% , podemos obtener un entero aleatorio de 0 a 32767. Porejemplo:echo %random%Obviamente, esto devuelve un número entero de 0 a 32767. Pero a veces queremos que esté enun rango específico, digamos de 1 a 100.Generando números aleatorios dentro de rango específicoEl método básico para hacerlo se detalla a continuación.set /a result=(%RANDOM%*max/32768)+mindonde max es el número superior que se puede generar, y min es el número más pequeño que sepuede generar. Tenga en cuenta que no obtendrá ningún número decimal porque set /aredondea automáticamente. Para generar un número aleatorio decimal, intente esto:set /a whole=(%RANDOM%*max/32768)+minset /a decimal=(%RANDOM%*max/32768)+minecho %whole%.%decimal%Generando números aleatorios mayores que 32767Si intentasset /a whole=(%RANDOM%*65536/32768)+1lo 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 2https://riptutorial.com/es/home 5

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 ajustaresto para que se ajuste a sus necesidades.Pseudoaleatoriocmd.exe genera la semilla en función del momento en que se inició la sección de cmd , por lo que siinicia la sección de mutliple casi al mismo tiempo, es posible que el resultado no sea losuficientemente aleatorio.Alfabetos al azarDesafortunadamente, los lotes no tienen un método incorporado para generar alfabetos, pero alusar %random% y for ciclo, podemos 'generar' alfabetos.Esta es una idea simple de cómo funciona esto.set /a result=(%random%*26/32768)+1for /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 aleatorio N entre 1 y 26• La instrucción for /f selecciona el elemento N th de una lista de la A a la Z.○ Devolver el resultadoUno puede poner un total de 31 artículos en 1 for bucle, y prácticamente artículos ilimitadosusando [este método]. ( Lote - para orden de parámetros de buclePseudoaleatorio y uniforme al azar en loteDistribución pseudoaleatoriaDe acuerdo con esta respuesta de desbordamiento de pila , el usuario CherryDT señaló estecódigo:set /a num=%random% %% 100No da una distribución uniforme.La variable dinámica interna %random% hace da una distribución uniforme, pero el código deseguridad no será un azar uniformado. Este código genera un número aleatorio entre 0 ~ 99, peroel 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 debecambiar 100 . Aquí hay un método para obtener un número que crea una distribución uniforme.https://riptutorial.com/es/home 6

Capítulo 2: Aleatorio en archivos por lotes

Examples

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

https://riptutorial.com/es/home 5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!