Mischen und Sortieren

Computer sind besonders zum Sortieren von Daten geeignet, aber was ist, wenn man das Gegenteil vor hat; wenn man Daten durcheinanderbringen will? Auch hierzu gibt es Lösungen, eine davon sind Zufallszahlen. Man kann sie gut gebrauchen, um willkürliche Beispieldaten für ein Programm zu erstellen. Auch in Spielen sind Zufallszahlen sehr wichtig.

Ein guter Zufallszahlengenerator sollte eine ungefähre Gleichverteilung seiner Ergebnisse liefern. Bei dem ersten Programm handelt es sich um ein Testprogramm für den Zufallszahlengenerator von Omikron.BASIC. Die beiden obersten Zeilen des Programms dienen der Einstellung Ihrer Bildschirmauflösung. Wenn Sie mit dem monochromen Monitor SM-124 von Atari arbeiten, dann lassen Sie die Einstellungen so, wie sie sind. Die Variable Step enthält die horizontale Auflösung des Tests. Kleinere Zahlen bringen hier eine höhere Auflösung. Scale enthält die vertikale Auflösung. Auch hier gilt: je kleiner, desto genauer. Die FOR-Schleife am Anfang dient der Erzeugung von Zufallszahlen. Wenn Sie einen selbstgeschriebenen Zufallsgenerator testen wollen, dann müssen Sie hier den RND-Befehl durch Ihren eigenen Unterprogrammaufruf ersetzen. Der Befehl TEXT HEIGHT = 4 schaltet für den TEXT-Befehl auf den 6x6-Systemzeichensatz um. An dieser Stelle ist auch mal ein bißchen Aufklärungsarbeit in Bezug auf den TEXT-Befehl angebracht. Die y-Koordinate in diesem Befehl gibt nicht etwa die obere Ecke für die Textausgabe an, sondern die Stelle, an der die Grundlinie des Textes steht. Die Grundlinie ist beim 6x6-Zeichensatz vier Punkte unterhalb der oberen Ecke. Dies ist auch der Grund, weshalb TEXT HEIGHT = 4 auf den 6x6-Zeichensatz umschaltet.

Das zweite Programm ist für alle Kartenspieler interessant. In diesem Programm wird ein sortiertes Kartenspiel gemischt und danach wieder sortiert. Die Karten werden dabei durch Zahlen von 0 bis 31 repräsentiert. Die Farbe einer Karte kann man mit INT(Karte/8) herausbekommen. Man erhält einen Wert von 0 bis 3, den man sehr einfach einer Zeichenkette, z.B. „Karo“ zuordnen kann. Die Karte selber erhält man durch (Karte MOD 8), also dem Divisionsrest. Etwas schneller und auch „computermäßiger“ wäre der Ausdruck (Karte AND 7), der zufälligerweise hier das gleiche Ergebnis liefern würde, der dafür aber schon das Verständnis von bitweisen Verknüpfungen voraussetzen würde. Interessant ist vielleicht auch die Methode, wie man ein Kartenspiel mischen kann. Dazu wird einfach jede Karte mit einer beliebigen, zufälligen anderen Karte vertauscht. Auf diese Weise dürfte eine bessere Durchmischung gewährleistet sein, als man sie durch manuelles Mischen erreichen könnte.

' (c)1992 by MAXON-Computer
Xmax%L=640
Ymax%L=400
Sstep%L=20
Scale%L=1
Mhoehe%L=Ymax%L/Scale%L/2 
X1%L= INT(Xmax%L/Sstep%L)
DIM A%L(X1%L)
PRINT "Ich berechne Zufallszahlen..."
FOR I%L=0 TO X1%L*Mhoehe%L-1 
    Zufall%L= RND(X1%L+1)
    A%L(Zufall%L)=A%L(Zufall%L)+1 
    IF (I%L AND 511) =511 THEN PRINT ".";
NEXT I%L 
PRINT
CLS : PRINT CHR$(27);"f": MODE =0: TEXT HEIGHT =4
FILL COLOR =1: FILL STYLE =2,4: OUTLINE ON : CLIP 0,0,Xmax%L,Ymax%L 
FOR I%L=0 TO X1%L
    PBOX I%L*Sstep%L,Ymax%L—A%L(I%L)*Scale%L TO (I%L+1)*Sstep%L,Ymax%L-1 
    IF Sstep%L>=14 THEN
        TEXT I%L*Sstep%L+(Sstep%L-12)/2,Ymax%L-5,RIGHT$(STR$(100+I%L),2)
        A$=MID$(STR$(A%L(I%L)),2) : A1%L= LEN(A$)*6 
        TEXT I%L*Sstep%L+(Sstep%L-A1%L)/2,Ymax%L-A%L(I%L)*Scale%L-2,A$
    ENDIF 
NEXT I%L

' (c)1992 by MAXON-Computer 
DIM A%L(31),Farbe$(3),Karte$(7)
FOR I%L=0 TO 3: READ Farbe$(I%L): NEXT I%L 
FOR I%L=0 TO 7: READ Karte$(I%L): NEXT I%L 
DATA "Karo","Herz","Pik","Kreuz"
DATA "Sieben","Acht","Neun","Zehn","Bube","Dame","König","Ass"
FOR I%L=0 TO 31 
    A%L(I%L)=I%L 
NEXT I%L
' ***Jetzt mischen!
FOR I%L=0 TO 31
    SWAP A%L(I%L),A%L( RND(32))
NEXT I%L
' ***Gemischt ausgeben 
Ausgabe
' ***jetzt wieder sortieren 
SORT A%L(0)
' ***und dann ausgeben
Ausgabe
END
'
'***** Prozeduren *****
'
DEF PROC Ausgabe 
    LOCAL I%L
    ' ***Automat. Zeilenumbruch einschalten (BASIC ab Version 3.5)
    PRINT CHR$(27);"v";
    FOR I%L=0 TO 31
        IF I%L THEN PRINT ", ";
        PRINT Farbe$( INT(A%L(I%L)/8));" ";Karte$(A%L(I%L) MOD 8);
    NEXT I%L 
    PRINT 
    PRINT 
RETURN

Arnd Rosemeier
Aus: ST-Computer 09 / 1992, Seite 86

Links

Copyright-Bestimmungen: siehe Über diese Seite