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 Zufallszahl N zwischen 1 und 26
  • Die for /f Anweisung wählt das N 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow