batch-file
In Batch-Dateien zufällig
Suche…
Zufällige Zahlen
Mit der dynamischen Variablen %Random%
können wir eine zufällige ganze Zahl von 0 bis 32767 erhalten. Beispiel:
echo %random%
Dies gibt natürlich eine ganze Zahl von 0 bis 32767 zurück. Manchmal möchten wir jedoch, dass sie in einem bestimmten Bereich liegt, beispielsweise zwischen 1 und 100.
Zufallszahlen innerhalb eines bestimmten Bereichs generieren
Die grundlegende Methode dazu ist unten aufgeführt.
set /a result=(%RANDOM%*max/32768)+min
Dabei ist max
die oberste Nummer, die generiert werden kann, und min
ist die kleinste, die generiert werden kann. Beachten Sie, dass Sie keine Dezimalzahlen erhalten, da das set /a
automatisch abrundet. Versuchen Sie Folgendes, um eine dezimale Zufallszahl zu generieren:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal%
Zufallszahlen größer als 32767 erzeugen
Wenn du es versuchst
set /a whole=(%RANDOM%*65536/32768)+1
Sie erhalten höchstwahrscheinlich zufällige Zahlen, die ungerade sind.
Um Zahlen größer als 32767 zu generieren, ist hier eine bessere Methode.
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
Der vorherige Code extrahiert das 1-Zeichen aus jedem %random%
. Dies geschieht jedoch absichtlich.
Da die random
eine einstellige Zahl sein kann, funktioniert das Extrahieren der letzten 2 Ziffer nicht. Deshalb extrahieren wir nur den letzten Buchstaben. In diesem Fall haben wir 6 %random:~-1%
, das Maximum von 999999
und das Minimum bei 000000
, Sie müssen dies möglicherweise an Ihre Bedürfnisse anpassen.
Pseudozufall
cmd.exe
generiert den Startwert auf der Basis der Zeit, zu der der cmd
Abschnitt gestartet wurde. Wenn Sie also mehrere Abschnitte fast gleichzeitig starten, ist das Ergebnis möglicherweise nicht "zufällig" genug.
Zufällige Alphabete
Leider verfügt Batch nicht über eine integrierte Methode zum Generieren von Alphabeten. Mit %random%
und for
loop können wir jedoch Alphabete "generieren".
Dies ist eine einfache Vorstellung davon, wie dies funktioniert.
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
)
- Der erste
set /a
Anweisung erzeugt eine ZufallszahlN
zwischen 1 und 26 - Die
for /f
Anweisung wählt dasN
te Element aus einer Liste von A bis Z aus.- Gib das Ergebnis zurück
Mit [dieser Methode] können insgesamt 31
Elemente in 1 for
Schleife und praktisch unbegrenzte Elemente eingefügt werden. ( Batch - für Schleifenparameterreihenfolge
Pseudozufall und Uniform zufällig im Stapel
Pseudozufällige Verteilung
Entsprechend dieser Stack Overflow-Antwort wies der Benutzer CherryDT auf diesen Code hin:
set /a num=%random% %% 100
ergibt keine gleichmäßige Verteilung.
Die interne dynamische Variable %random%
tut ergibt eine gleichmäßige Verteilung, aber der obige Code nicht ein uniformierter zufällig sein. Dieser Code generiert eine Zufallszahl zwischen 0 und 99, das Ergebnis ist jedoch nicht einheitlich. 0 ~ 67 wird mehr als 68 ~ 99 auftreten, da 32767 MOD 100
= 67
.
Um mit dem obigen Code eine gleichmäßig verteilte Zufallszahl zu erzeugen, muss 100
geändert werden. Hier ist eine Methode, um eine Zahl zu erhalten, die eine gleichmäßige Verteilung erzeugt.
32767 mod (32767 / n)
Wenn n
eine ganze Zahl zwischen 0 und 32767 ist, kann das Ergebnis dezimal sein und im Stapel nicht funktionieren.
Einheitliche Verteilung
set /a result=(%RANDOM%*100/32768)+1
Diese Methode erzeugt eine gleichmäßige Verteilung. Es vermeidet die Verwendung von %
, was mehr wie "Rest" als "Modul" in einem Batch-Skript ist. Ohne Verwendung von %
ist das Ergebnis einheitlich.
Alternativ ist hier eine ineffiziente, aber einheitliche Methode.
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
Ändern Sie [yourMinNumber]
und [yourMaxNumber]
entsprechend Ihren eigenen Werten.