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 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 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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow