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

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éatoire N compris entre 1 et 26
  • L'instruction for /f sélectionne le N è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)

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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow