★ CODING ★ LISTINGS ★ Dem Zufall auf der Spur ★ |
Zufallszahlen in Assembler (CPC Amstrad International) | Coding Listings |
Zufallszahlen in Assembler für alle CPCs Was im Zusammenhang mit Computern als Zufaliszahl bezeichnet wird, müßte korrekterweise in Anführungszeichen stehen oder mit dem Präfix “Pseudo-“ versehen werden, weil diese Zahlen aus streng mathematischer Sicht keine richtigen zufälligen Werte sind. Wie sollten sie auch? Der Computer ist ja ein Rechner und kein Würfel... Zufallswerte braucht man bei vielerlei Gelegenheiten. Zum Beispiel bei Vokabeltrainem, wo zufällig ein Wort aus der Liste herausgesucht werden soll. Oder bei der zufälligen Bestimmung des Anfangsortes eines Spieles (z.B.: Sorcery). Im Folgenden werden wir drei in Z80 Assembler geschriebene Programme vorstellen, die sich mit dieser Thematik befassen. 1. Die “Holzhacker-Methode“ Mit brachialer Gewalt und ohne viel Überlegung (Rechnung) kommt unser erstes Beispiel aus. Der Schneider unterhält während der Programmabläufe einen Zähler, der jede 1/300 Sekunde um eins erhöht wird. Dieser Zähler, den man mit der BASIC-Funktion TIME abfragen kann, wäre in gewisser Weise schon ein zufälliger Wert. Damit die Sache aber nicht zu durchsichtig wird, nehmen wir von diesem vier Bytes großen Zähler nur die beiden niederwertigsten Bytes, die bei der Abfrage via KL TIME PLEASE (# BDOD) in den Registern H und L sind. Da sich das höherwertige Byte im Register H nicht so schnell verändert, nehmen wir jetzt noch den Pseudo-Zufallswert aus dem Refresh- Register (eine Art interner Zähler des Z80-Prozessors) und verknüpfen (d.h.: “XORie-ren“) diesen mit dem Highbyte: Was dabei herauskommt, sehen Sie im Assembler-Listing 1 (nennen wir dieses Verfahren am besten “Alfred E. Neumann-Algorithmus“). Sie sehen: Das Ganze ist im Grunde genommen gar keine Zufallszahl. Eine Obergrenze kann nicht angegeben werden. Falls der Computer mit ausgeschalteten Interrupts (im DI-Modus) arbeitet, können Sie das Ganze sowieso vergessen, weil dann die interne Uhr nicht mehr weitergezählt wird und nun immer denselben Wert zurückgibt. Probieren wir es also mit einem zweiten Versuch: 2. Schon besser:, aber dafür ziemlich lang Diese Methode basiert auf einem Anfangswert, von dem die folgenden “Zufallszahlen“ abhängig sind. Diese werden durch mehrere Operationen verändert (in unserem Fall durch Multiplikationen und Divisionen). Ein Vorteil dieser Routine ist, daß man eine Obergrenze der zu erzeugenden Zufallszahlen setzen kann. 3. Fast perfekt:, aber kein Zufall Da die letzte Routine doch noch relativ lang war, versuchen wir jetzt noch, die Multiplikationen und Divisionen durch einfachere Bit-Rotationen zu ersetzen. Was dabei herauskommt, sehen Sie in unserem Listing 3. Zwar kann man hier keine Obergrenze mehr angeben, aber diese könnte ja durch eine MODulo-Funktion künstlich gesetzt werden. Das vorliegende Programm basiert auf Analysen der Fließkomma-Arithmetik im unteren ROM des CPC 464. Dort werden Fließkomma-RNDs auf ähnliche Weise erzeugt. Der Startwert kann dort ja bekanntlich mit RANDOMIZE gesetzt werden. Der Zufall, der keiner war... Wie Sie sehen, gibt es keine wirklichen Zufallszahlen auf dem Computer. Zwar kann der Mensch auf den Mond fliegen, neue Philosophien entwickeln und Atomkerne spalten, aber Zufallszahlen erzeugen kann er nicht, denn der Zufall läßt sich nun einmal nicht berechnen. Damit müssen wirleben. E. Röscheisen/JB, CPCAI
|