Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Einmalige Zufallszahlen

Selbstverständlich ist es nicht im Sinne eines Lottospiels, wenn Zahlen mehrfach ausgelost werden, aber noch fehlt der Anwendung eine Möglichkeit zur Kontrolle und alle Zahlen sind unabhängig voneinander.
Vielleicht könnte man mit einer komplexen Folge von if-Strukturen prüfen, ob eine Zufallszahl bereits ermittelt wurde, aber so eine Vorgehensweise ist nicht empfehlenswert und würde auch sehr kompliziert, wenn mehr Zahlen ausgespielt werden sollen. Besser wäre eine Methode, die nicht nur sechs, sondern eine beliebige Anzahl von Zufallswerten generieren könnte, ohne dass dabei der Programmcode aufwendig angepasst werden müsste.
Um die Vergleiche mit bereits ermittelten Zufallszahlen zu vereinfachen, kommt im nachfolgenden Programmcode ein NSMutableArray zum Einsatz, in dem alle gültigen Werte abgelegt werden. Der Typ NSMutableArray erlaubt es, während der Laufzeit der Anwendung weitere Objekte zu Auflistung hinzuzufügen. Ein einfaches NSArray kann dies nicht. Dort müssen alle zu verwaltenden Objekte schon bei der Initialisierung übergeben werden.
Der Programmablauf für das beschriebene Problem ist recht überschaubar. Eine Zufallszahl wird erzeugt, die anschließend mit jeder Zahl, die schon in der Auflistung ist, verglichen wird. Befindet sich der Wert noch nicht im Array, wird er als gültige neue Zufallszahl erkannt und anschließend der Liste hinzugefügt, damit sie für weitere zu generierende Zahlen als schon vorhanden erkannt werden kann. Grob skizziert sieht der Programmcode dafür so aus:
// Neue Zufallszahl erzeugen
    zufallszahl = [[NSNumber alloc] initWithInt:(random() % 49) +1];
    // Diese Zufallszahl ist einmalig bist das Gegenteil bewiesen ist
    valid = true;
   
    // Prüfen ob diese Zahl mit einem Elemente
    // im Array übereinstimmt
    for (int x = 0; x < zufallsArray.count; x++)
    {
        if (zufallszahl.intValue == [zufallsArray[x] intValue])
        {
            // Übereinstimmung gefunden,diese Zahl gibt es schon
            valid = false;
            break;
        }
    }
   
    // Neue Zahl ermittelt. Zahl zum Array hinzufügen
    [zufallsArray addObject: zufallszahl];
Wie Sie sicher bemerkt haben, wird hier nicht mehr int sondern NSNumber als Datentyp für die Zufallszahl benutzt. Der Grund dafür ist recht einfach: Ein NSMutableArray kann nur Zeiger auf Objekte verwalten und ein Integer ist eben kein Objekt, sondern nur ein Wertetyp, gelegentlich auch als einfacher Datentyp bezeichnet. NSNumber ist daher besser geeignet.
Zu Anfang ist natürlich noch kein Objekt im Array, woraufhin die erste generierte Zufallszahl sofort der Auflistung hinzugefügt werden kann. Da insgesamt sechs Zahlen generiert werden sollen, darf eine for-Schleife nicht fehlen. Am Ende werden alle Zahlen aus dem Array in die Textfelder geschrieben. Um den Kompiler zufrieden zu stellen, ohne die Werte aufwändig konvertieren zu müssen, wird die Eigenschaft stringValue verwendet.
Die ganze Methode sieht dann so aus:
- (IBAction)lottoSpielen:(id)sender
{
    NSMutableArray *zufallsArray;
    zufallsArray = [[NSMutableArray alloc] init];
   
    NSNumber *zufallszahl;
    bool valid;
   
    for (int a = 0; a < 6; a++)
    {
        valid = false;
       
        // Solange Zufallszahlen erzeugen bis eine gültige, noch nicht
        // vorhandene Zahl ermittelt wurde.
        while (valid == false)
        {
            // Neue Zufallszahl erzeugen
            zufallszahl = [[NSNumber alloc] initWithInt:(random() % 49) +1];
            // Diese Zufallszahl ist einmalig bist das Gegenteil bewiesen ist
            valid = true;
           
            // Prüfen ob diese Zahl mit einem Elemente
            // im Array übereinstimmt
            for (int x = 0; x < zufallsArray.count; x++)
            {
                if (zufallszahl.intValue == [zufallsArray[x] intValue])
                {
                    // Übereinstimmung gefunden,diese Zahl gibt es schon
                    valid = false;
                    break;
                }
            }
        }
       
        // Neue Zahl ermittelt. Zahl zum Array hinzufügen
        [zufallsArray addObject: zufallszahl];
    }
   
    self.zufall1.stringValue = zufallsArray[0];
    self.zufall2.stringValue = zufallsArray[1];
    self.zufall3.stringValue = zufallsArray[2];
    self.zufall4.stringValue = zufallsArray[3];
    self.zufall5.stringValue = zufallsArray[4];
    self.zufall6.stringValue = zufallsArray[5];
}
Haben Sie alles richtig eingegeben, sollten Sie jetzt Ihren eigenen voll funktionsfähigen Lottozahlengenerator programmiert haben. Doppelte Zahlen werden jetzt nicht mehr ausgelost, das können Sie durch einen Test schnell selbst kontrollieren.

nächste Seite