Würfeln in Windows-Batchdateien

Etwas, was ich nun schon vor einiger Zeit geschrieben habe (Februar 2007): Ein Würfelprogramm. Unterstützt wird eine beliebige Anzahl an Würfeln (naja, zumindest bis zu gewissen anderen Beschränkungen in der Shell, wie 32-bit-Ganzzahlen und Zeichenketten um 32000 Zeichen) und beliebig viele Würfelseiten (bis zu … naja, kennen wir schon). Also, wenn man zum Beispiel 1200 Würfel mit 462 Seiten würfeln möchte, dann kann man das auch tun:
C:>roll 1200d462
Die Ergebnisse werden dann auf der Konsole ausgegeben in der Reihenfolge wie sie gewürfelt wurden. Sortiert wird momentan nicht, ich hatte bislang noch keine Lust, auch nur einfache Sortieralgorithmen zu implementieren, aber irgendwann kommt das sicher.

Diese harmlos aussehende Batchdatei enthält einen endlichen Automaten um die Parameter zu parsen. Diese werden von dem folgenden regulären Ausdruck beschrieben:

[1-9][0-9]*[WDwd][1-9][0-9]*(\+[1-9][0-9]*)?

Ich erlaube sowohl die deutsche als auch die englische Notation (w und d) als Trennzeichen für die Anzahl und die Seiten der Würfel sowie die Option, alle Würfe und eine Konstante aufzusummieren (für Initiativewürfe in Shadowrun 3). Aufgrund des Parsers kriegt der Benutzer relativ genaue Angaben über Fehler und wo genau ein Fehler auftrat (vielleicht wäre es mal an der Zeit für ein allgemeines Tool, welches endliche Automaten in Batch generiert :-)).

Einige Beschränkungen:

  • Würfeln ist langsam, also 1000 Würfe brauchen ein wenig.
  • Da CMD nur 32-bit-Ganzzahlen mit Vorzeichen kennt, ist die maximale Anzahl von Würfeln 2147483647.
  • Da die Resultate in einer einzelnen Umgebungsvariable gespeichert werden, die auf 32764 Zeichen beschränkt sind, ist die maximal nutzbare Anzahl an Würfeln deutlich kleiner. Sonst werden halt ein Haufen Ergebnisse abgeschnitten.
  • Da der Pseudozufallszah­lengenerator von CMD lediglich eine Zahl zwischen 0 und 32767 liefert, ist die maximale praktische Anzahl an Würfelseiten 32768. Ansonsten wird kein Wurf ein Ergebnis größer als 32768 liefern.
  • Da einzelne Würfe durch eine Modulo-Operation auf die Anzahl der Seiten gebracht werden, sind die Resultate nicht gleich verteilt, wenn die Anzahl der Seiten kein Teiler von 32768 ist (Das dürfte besonders auffällig bei mehr als 16384 Seiten sein).

Der Code ist fast undokumentiert, aber das macht beim Lesen nur um so mehr Spaß :-)

AnhangGröße
roll.cmd3.43 KiB

Kommentare

Neuen Kommentar abgeben

The content of this field is kept private and will not be shown publicly.