Cocoa lernen - Schritt für Schritt
Cocoa lernen - Schritt für Schritt
Einmalige Zufallszahlen

Selbstverständlich ist es nicht im Sinne eines Lottospiels, wenn Zahlen mehrfach ausgelost werden, aber noch fehlt der Anwendung eine Methode, die dies kontrolliert und alle Zahlen sind unabhängig voneinander.
Natürlich 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 es würde auch sehr kompliziert, je mehr Zahlen ausgespielt werden sollen. Besser wäre eine Methode, die nicht nur sechs, sondern eine beliebige Anzahl von Zufallswerten generieren könnte, ohne das dabei der Programmcode aufwendig angepasst werden müsste.

Um diese Anforderung zu realisieren, kommt im nachfolgenden Programmcode ein NSMutableArray zum Einsatz. Dieses Array dient als eine Liste von Speicherzeigern und NSMutableArray ist ein Array-Typ, der es erlaubt, während der Laufzeit des Programms weitere Objekte zu diese Auflistung hinzuzufügen. Der Programmablauf ist dabei recht überschaubar. Eine Zufallszahl wird erzeugt, die anschließend mit jeder Zahl, die schon im Array ist, verglichen wird. Befindet sich die Zahl noch nicht im Array, wird sie als gültige neue Zufallszahl erkannt und anschließend dem Array 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
zZahl = [[NSNumber alloc] initWithInt:(random() %
49) +1];

// Diese Zahl ist gültig bist das Gegenteil bewiesen ist
valid = true;

// Prüfen ob diese Zahl mit einem der Elemente im Array übereinstimmt
for (int x = 0; x < [zArray count]; x++)
{
    if (zZahl intValue] == [[zArray objectAtIndex:x] intValue])
    {
        // Übereinstimmung gefunden, neue Zahl erzeugen
        valid = false;
       
break;
    }
}

// Neue Zahl ermittelt. Zahl zum Array hinzufügen
[zArray addObject: zZahl];
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. Allerdings ist ein Integer kein Objekttyp, sondern ein Wertetyp, NSNumber hingegen schon und 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, fehlt natürlich noch eine for-Schleife. Ausserdem müssen vor der Schleife noch einige Variablen und Objekte deklariert werden und zum Schluss werden die Zufallszahlen in die NSTextfield geschrieben. 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 objectAtIndex:x] intValue])
              {
                   // Übereinstimmung gefunden,diese Zahl gibt es schon
                    valid = false;
                   // Zahl aus dem Speicher entfernen
                   [zufallszahl release];
                   break;
                }
           }
        }
   
        // Neue Zahl ermittelt. Zahl zum Array hinzufügen
        [zufallsArray addObject: zufallszahl];
        [zufallszahl release];
    }

    [zufall1 setStringValue:[zufallsArray objectAtIndex:0]];
    [zufall2 setStringValue:[zufallsArray objectAtIndex:1]];
    [zufall3 setStringValue:[zufallsArray objectAtIndex:2]];
    [zufall4 setStringValue:[zufallsArray objectAtIndex:3]];
    [zufall5 setStringValue:[zufallsArray objectAtIndex:4]];
    [zufall6 setStringValue:[zufallsArray objectAtIndex:5]];
    [zufallsArray release];
}
Haben Sie alles richtig eingegeben, sollte Sie jetzt Ihren eigenen voll funktionsfähigen Lottozahlen Generator programmiert haben. Doppelte Zahlen sollten jetzt nicht mehr ausgelost werden, aber das können Sie durch einen Test schnell selbst kontrollieren.

nächste Seite