batch-file
Fichiers aléatoires dans le lot
Recherche…
Nombres aléatoires
En utilisant la variable dynamique %Random%
, on peut obtenir un entier aléatoire de 0 à 32767. Par exemple:
echo %random%
Cela retourne évidemment un entier de 0 à 32767. Mais parfois nous voulons qu'il soit dans une plage spécifique, par exemple de 1 à 100.
Génération de nombres aléatoires dans une plage spécifique
La méthode de base pour le faire est répertoriée ci-dessous.
set /a result=(%RANDOM%*max/32768)+min
où max
est le plus grand nombre pouvant être généré et min
est le plus petit nombre pouvant être généré. Notez que vous n'obtiendrez aucun nombre décimal, car vous set /a
arrondit automatiquement. Pour générer un nombre aléatoire décimal, essayez ceci:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Génération de nombres aléatoires supérieurs à 32767
Si tu essayes
set /a whole=(%RANDOM%*65536/32768)+1
vous obtiendrez probablement des nombres aléatoires qui sont impairs.
Pour générer des nombres supérieurs à 32767, voici une meilleure méthode.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Le code précédent extrait le caractère 1 de chaque %random%
. Mais cela est fait exprès.
Comme le nombre random
peut être un nombre à un chiffre, l'extraction du dernier chiffre ne fonctionnera pas. C'est pourquoi nous n'extrayons que le dernier caractère. Dans ce cas, nous avons 6 %random:~-1%
, générant le maximum de 999999
, et le minimum à 000000
, vous devrez peut-être ajuster cela pour répondre à vos besoins.
Pseudo-aléatoire
cmd.exe
génère la graine en fonction de l'heure à laquelle la section cmd
a commencé, donc si vous lancez une section multiple au même moment, le résultat risque de ne pas être "aléatoire".
Alphabets aléatoires
Malheureusement, batch ne dispose pas d'une méthode intégrée pour générer des alphabets, mais en utilisant %random%
et for
loop, nous pouvons "générer" des alphabets.
Ceci est une idée simple de comment cela fonctionne.
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
)
- Le premier
set /a
instruction génère un nombre aléatoireN
compris entre 1 et 26 - L'instruction
for /f
sélectionne leN
ème élément d'une liste de A à Z.- Renvoyer le résultat
On peut mettre un total de 31
éléments en 1 for
boucle, et des éléments pratiquement illimités en utilisant [cette méthode]. ( Lot - pour l'ordre des paramètres de boucle)
Pseudo-aléatoire Et Aléatoire Aléatoire En Lot
Distribution pseudo-aléatoire
En accédant à cette réponse Stack Overflow , l'utilisateur CherryDT a souligné ce code:
set /a num=%random% %% 100
ne donne pas une distribution uniforme.
La variable dynamique interne %random%
do donne une distribution uniforme , mais le code ci-dessus ne sera pas un aléatoire uniforme. Ce code génère un nombre aléatoire compris entre 0 et 99, mais le résultat ne sera pas uniforme. 0 ~ 67 se produiront plus de 68 ~ 99 depuis 32767 MOD 100
= 67
.
Pour générer un aléatoire distribué uniforme en utilisant le code ci-dessus, alors 100
doit être modifié. Voici une méthode pour obtenir un nombre qui crée une distribution uniforme.
32767 mod (32767 / n)
où n
est un entier, entre 0 et 32767, le résultat peut être décimal et ne pas fonctionner en batch.
Distribution uniforme
set /a result=(%RANDOM%*100/32768)+1
Cette méthode générera une distribution uniforme. Cela évite d'utiliser %
, qui ressemble plus à "reste" qu'à "module" dans un script batch. Sans utiliser %
, le résultat sera uniforme.
Alternativement, voici une méthode inefficace mais 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.
)
)
Changez [yourMinNumber]
et [yourMaxNumber]
selon vos propres valeurs.