Variables aléatoires dans des Fichiers Batch
Je suis en train de créer une variable aléatoire entre 0 et 3 avec un fichier de commandes. Droit maintenant, j'ai le code suivant:
@echo off
set /a var=%random%/8192
@echo %var%
Pause
Ce fichier de commandes renvoie "2" à chaque fois. Si je tape les mêmes commandes dans la ligne de commande directement elle renvoie la valeur 0 à 3.
Des connaissances connexes, serait apprécié 🙂
Je ne suis pas à avoir ce problème. Essayez de prendre le
Votre code de générer un nombre aléatoire entre 0 et 3; la bonne formule serait:
@
avant @echo %var%
? Bien que cela ne devrait pas changer quoi que ce soit...Votre code de générer un nombre aléatoire entre 0 et 3; la bonne formule serait:
set /a var=%random%/6554
. Cependant, le standard la formule est beaucoup plus claire (voir ma réponse ci-dessous).OriginalL'auteur Nick | 2013-04-07
Vous devez vous connecter pour publier un commentaire.
MODIFIER: j'ai changé ma réponse parce que l'OP a changé sa question: a l'origine, la gamme de nombres aléatoires de 0 à 4...
La bonne formule est:
L'utilisation d'autres opérateurs au lieu (comme /ou en %) modifier de nombres aléatoires de distribution, de sorte que vous obtiendrez un répétée plus souvent que la bonne formule.
MODIFIER: des explications Supplémentaires ajouté
Code précédent fonctionne correctement dans votre exemple ci-dessus. Toutefois, si votre code est placé à l'intérieur d'un bloc de code (entre parenthèses), alors vous devez utiliser Expansion Retardée (comme d'autres personnes ont indiqué dans leurs réponses) dans tous variables qui peuvent être modifiées à l'intérieur du bloc, y compris au HASARD. Par exemple:
Si vous le souhaitez, vous pouvez utiliser cette formule plus simple qui donne des résultats équivalents (nombres aléatoires entre 0 et 3):
L'Op veut "créer une variable aléatoire entre 0 et 4", et "%RANDOM% - se développe à un nombre décimal aléatoire entre 0 et 32767" (prises de
set /?
). Cela signifie qu' %random%/8192 produire un nombre aléatoire entre 0 et 3 (l'essayer:set /a 32767/8192
).vous avez raison, bien sûr. Désolé à ce sujet. J'ai un enfant en bas âge de l'escalade sur moi en ce moment et ne peut pas mettre à jour ma réponse. Si vous êtes d'accord avec mon explication sur le pourquoi de son code a des résultats différents lorsqu'il est exécuté via cmd rapport script de commandes, n'hésitez pas à copier / coller de ma réponse si au moins une réponse sur ce fustigé le thread va résoudre tous les problèmes démontré par l'op. 🙂 +1 à l'avance.
Cela a fait l'affaire! Merci!!!!
OriginalL'auteur Aacini
Je pense que, vous utilisez %random% à l'intérieur d'un
if
oufor
bloc de code. Dans ce cas, vous devezdelayed expansion
et !les variables! au lieu de %variables%. Exemple:OriginalL'auteur Endoro
Modulo fonctionne assez bien dans cette situation:
Serait mis
%ran%
à un nombre entre 1 et 4. Toutefois, cela ne fonctionne que dans un fichier de commandes.Sur l'invite de commande, vous devez:
OriginalL'auteur BDM
Votre code est bien. J'ai un soupçon de bien. Dans votre script complet, ne vous
set var
et vérifier sa valeur à l'intérieur d'unfor
boucle ouif
déclaration? Si donc, lorsque vous vérifiez la valeur de%var%
le résultat est quoi votre script hérité comme la variable d'environnement%var%
's valeur, sans doute un vestige de la ligne de commande de test à l'extérieur du script.Si mon évaluation est vrai, alors vous avez besoin d'un
setlocal enabledelayedexpansion
etecho !var!
. Sinonfor
ouif
permettra d'évaluer%var%
avec la valeur contenue à l'époquefor
ouif
a d'abord été rencontrés.Je vous invite à relire ma réponse?... Merci
OriginalL'auteur rojo
La commande que vous voulez est:
Cela vous donnera: 0, 1, 2 ou 3.
Si vous faites cela à l'intérieur d'une boucle FOR utiliser !..!-le type de la variable au lieu de %..%-type des variables dans ce cas, vous aurez également besoin d'
setlocal enabledelayedexpansion
quelque part près du début de votre fichier de commandes.OriginalL'auteur Paul Tomasi