Technologische Neuigkeiten, Bewertungen und Tipps!

Zufallszahlen in Swift

Hinweis: Der folgende Artikel hilft Ihnen weiter: Zufallszahlen in Swift

Zurück zum Blog

Werfen wir einen Blick auf Zufälligkeit und Zufallszahlen in Swift. Swift verfügt über eine Reihe integrierter Funktionen, die Ihnen beim Generieren von Zufallszahlen helfen, allerdings mit einigen Einschränkungen!

Aber zuerst … warum braucht man in Swift Zufallszahlen?

  • In Spiele-Apps verwenden Sie Zufallszahlen, um Würfelwürfe zu simulieren oder sogar „Chaos“ und Unvorhersehbarkeit in Ihren Spielen zu simulieren, wie etwa zufällige Gegnerpositionen oder zufällige Upgrade-Spawns
  • In der praktischen iOS-Entwicklung verwenden Sie Zufälligkeit, um ein zufälliges Element aus einem Array auszuwählen
  • Beim Erstellen eines Objekts oder eines neuen Benutzers benötigen Sie manchmal eine zufällige eindeutige ID

In Swift 4.2. und darüber hinaus hat sich die Art und Weise, wie Sie mit Zufallszahlen arbeiten, geändert. Anstatt die importierte C-Funktion arc4random() zu verwenden, können Sie jetzt Swifts eigene native Funktionen verwenden.

Schauen wir uns ein Beispiel an:

let number = Int.random(in: 0..<10)
Das obige Beispiel generiert eine zufällige Ganzzahl zwischen 0 und 10. Der halboffene Bereichsoperator ..< wird verwendet und das Ergebnis ist ein Bereich, der von 0 bis 10 reicht, ohne 10.
Sie können auch den geschlossenen Bereichsoperator … verwenden, um eine zufällige Ganzzahl von 0 bis 10, einschließlich 10, zu erhalten. So:

let number = Int.random(in: 0…10)

Sie können die Funktion random(in:) verwenden, um Zufallswerte für mehrere primitive Typen wie Int, Double, Float und sogar Bool abzurufen. So was:

lass Bruch = Float.random(in: 0..<1)
Das obige Beispiel gibt einen zufälligen Gleitkommawert zurück, also eine Zahl mit einem Bruch, zwischen 0 und 1.

Und das folgende Beispiel gibt entweder true oder false zurück – einen zufälligen Booleschen Wert! Sie sind sehr nützlich, um bedingte Logik zufällig zu testen.

let StayOrGo = Bool.random()
Wie wäre es mit der Auswahl eines zufälligen Elements aus einem Array? Das können Sie so machen:

lass Namen = [“Ford”, “Zaphod”, “Trillian”, “Arthur”, “Marvin”]
lass randomName = namen.randomElement()

Im obigen Code verwenden Sie randomElement() für das Namensarray. Sie können diese Funktion für jede Sammlung verwenden, beispielsweise für Arrays und Wörterbücher. Beachten Sie, dass das zurückgegebene Zufallselement optional ist.

Können Sie die neuen Zufallsfunktionen auch in Swift 4.2 verwenden? ein Array mischen? Ja! Das Randomisieren der Reihenfolge eines Arrays ist überraschend einfach:

Var-Namen = [“Ford”, “Zaphod”, “Trillian”, “Arthur”, “Marvin”]
Namen.shuffle()
// „Namen“ können jetzt sein: [“Zaphod”, “Marvin”, “Arthur”, “Ford”, “Trillian”]

Die Shuffle-Funktionen verwenden die typische Namensstruktur von Swift, sodass shuffle() das Array an Ort und Stelle mischt, wodurch das ursprüngliche Array verändert wird, und shuffled() eine Kopie des gemischten Arrays zurückgibt.

Sie können sogar eine Sequenz mischen, etwa so:

let sequence = 0 ..< 7 let shuffledSequence = sequence.shuffled() // `shuffledSequence` kann jetzt sein: [0, 6, 2, 3, 4, 1, 5]
Ganz einfach, oder? Viel einfacher als arc4random_uniform(_:) vor 4.2 mit all dieser Typumwandlung …

Verwenden Sie eine Swift-Version niedriger als 4.2? Dann verwenden Sie die Zufallszahlenfunktionen in den folgenden Kapiteln.

Swift hat drei typische Funktionen für Zufallszahlen:

arc4random() gibt eine Zufallszahl zwischen Null und 232–1 zurück
arc4random_uniform(_:) gibt eine Zufallszahl zwischen Null und dem ersten Parameter minus eins zurück.
drand48() gibt ein zufälliges Double zwischen 0,0 und 1,0 zurück
Sowohl arc4random() als auch arc4random_uniform(_:) verwenden den UInt32-Typ anstelle des typischeren Int.

Es wird empfohlen, arc4random_uniform(_:) anstelle von arc4random() zu verwenden, da letzteres unter einer Bedingung namens „Modulo-Bias“ leidet. Dies führt dazu, dass bestimmte Zahlen häufiger erscheinen als andere, was die „Zufälligkeit“ der Funktion untergräbt.

Beachten Sie, dass die Zufallszahlen dieser Funktionen halbzufällig sind und mit einer mathematischen Funktion generiert werden. Obwohl sie zufällig erscheinen, werden Sie Muster und Wiederholungen erkennen, wenn Sie die Zufallsfunktion oft genug wiederholen. Dies ist für Spiele oder das Mischen eines Arrays in Ordnung, Sie sollten diese Zufallsfunktionen jedoch nicht für Kryptografie- oder Sicherheitszwecke verwenden.

Interessante Tatsache: Frühe Computer und insbesondere Computerspiele enthielten eine Datei mit Zufallszahlen. Das Programm würde nacheinander Zufallszahlen aus dieser Datei auswählen, wann immer es eine Zufallszahl benötigte, anstatt selbst eine Zufallszahl zu berechnen!

Heutzutage ist der Mechanismus nicht viel anders, obwohl iOS oder Android über eine große Reserve an zufällig generierten Zahlen verfügen. Das Berechnen einer großen Menge von Zufallszahlen vor deren Verwendung wird als Seeding bezeichnet.

Die Funktion arc4random_uniform(_:) benötigt einen Parameter, die Obergrenze. Es wird eine Zufallszahl zwischen 0 und dieser Obergrenze minus 1 zurückgegeben.

So was:

arc4random_uniform(42)
// Ausgabe: 13
Dadurch wird eine Zufallszahl zwischen 0 und 41 zurückgegeben. Das Ergebnis ist vom Typ UInt32. Wenn Sie also mit einer gewöhnlichen Ganzzahl in Ihrem Code arbeiten möchten, müssen Sie diese in Int konvertieren oder umwandeln.

So was:

sei n = Int(arc4random_uniform(42))
Die Konstante n ist jetzt vom Typ Int, was einfacher zu handhaben ist.

Was ist mit Doppeln? Wie Sie wissen, ist ein Double eine Dezimalzahl mit doppelter Genauigkeit. In Swift wird es am häufigsten für Zahlen mit Kommas oder Brüchen verwendet.

So generieren Sie in Swift ein zufälliges Double zwischen 0,0 und 1,0:

sei d = drand48()
drucken(d)
// Ausgabe: 0,396464773760275
Sauber!

Kurzer Hinweis: Alle Computer haben Probleme mit der Darstellung von Gleitkommazahlen und Brüchen. Daher funktioniert die Funktion drand48() logischerweise, indem sie einfach ein paar ganze Zahlen hintereinander setzt …

Nun ist es etwas seltsam, mit der Funktion arc4random_uniform(_:) zu arbeiten. Schreiben wir eine praktische Funktion, die Ihnen bei der Arbeit mit Zufallszahlen hilft.

So was:

func random(_ n:Int) -> Int {
return Int(arc4random_uniform(UInt32(n)))
}
Diese Funktion verwendet einen unbenannten Parameter n vom Typ Int und gibt eine Ganzzahl zwischen 0 und n-1 zurück. Wie Sie sehen können, wird n im Aufruf arc4random_uniform(_:) in UInt32 konvertiert und der Rückgabewert von arc4random_uniform(_:) wird zurück in Int konvertiert.

Wenn Sie Swift 4.2 verwenden. oder höher benötigen Sie diese Komfortfunktionen nicht. Verwenden Sie einfach .random() oder .randomElement(), wie in den obigen Kapiteln erläutert.

Als nächstes können Sie ein paar Zufallszahlen wie folgt generieren:

für i in 0…100 {
print(random(100))
}
Dadurch werden 100 Zufallszahlen zwischen 0 und 99 ausgegeben.

Swift hat einen halboffenen Bereichsoperator wie diesen 0..<42. Warum ändern Sie damit nicht die Komfortfunktion? So: func random(_ range:Range) -> Int
{
return range.lowerBound + Int(arc4random_uniform(UInt32(range.upperBound – range.lowerBound)))
}

Anstelle einer einzelnen Eingabezahl nimmt diese Funktion einen Bereich wie 0..<42 an und gibt eine Zahl zwischen 0 und 42 zurück, ohne 42.
Innerhalb der Funktion wird das Ergebnis zunächst zur Untergrenze des Bereichs addiert, um sicherzustellen, dass die Zufallszahl immer an dieser Untergrenze beginnt. Innerhalb der Funktion arc4random_uniform(_:) wird die Untergrenze von der Obergrenze subtrahiert, sodass das zurückgegebene Ergebnis genau zwischen der Unter- und Obergrenze liegt.

Diese Funktion verwendet bewusst den generischen Typ Range mit halboffenem Bereich anstelle des generischen Typs ClosedRange mit geschlossenem Bereich, da er den Bereich der resultierenden Zahlen aus arc4random_uniform(_:) besser widerspiegelt.

Sie können die Funktion „Random-Number-from-Range“ wie folgt verwenden:

für i in 0…100 {
print(random(1..<42)) }
Dadurch werden 100 Zufallszahlen zwischen 1 und 41 ausgedruckt.

Wie erhält man eine Zufallszahl aus einem Array?

Wie Sie wissen, gibt die Funktion arc4random_uniform(_:) eine Ganzzahl zwischen Null und der Obergrenze zurück. Wenn wir array.count als Obergrenze verwenden, gibt die Funktion eine Indexnummer innerhalb der Grenzen des Arrays zurück!

So was:

lass Namen = [“Arthur”, “Ford”, “Zaphod”, “Marvin”, “Trillian”]

let random = Namen[Int(arc4random_uniform(UInt32(names.count)))]
drucken (zufällig)
// Ausgabe: Marvin
In diesem Beispiel wird eine Zufallszahl zwischen Null und „names.count“ erstellt und verwendet, um mit tiefgestellter Syntax einen Wert aus dem „names“-Array abzurufen.

Sie können das obige Beispiel bequem in eine Erweiterung für Array umwandeln, etwa so:

Erweiterungsarray
{
func random() -> Element {
selbst zurückkehren[Int(arc4random_uniform(UInt32(self.count)))]
}
}
Auf die gleiche Weise wie zuvor wird ein zufälliges Element aus dem Array zurückgegeben. Im obigen Beispiel bezieht sich Element auf einen Typalias des Elements im Array und self auf die aktuelle Array-Instanz.

Sie können es so verwenden:

lass Namen = [“Arthur”, “Ford”, “Zaphod”, “Marvin”, “Trillian”]
print(names.random())
// Ausgabe: Trillian
Wie wäre es mit dem Mischen eines Arrays? Schauen Sie sich dieses Tutorial an: Arrays in Swift mit Fisher-Yates mischen

Was ist, wenn Sie eine zufällige Zeichenfolge generieren möchten? Das können Sie so machen:

func randomString(_ n: Int) -> String
{
let digits = „abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890“
var result = „“

für _ in 0.. String {
let digits = „abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890“
return String(Array(0..

  • Strings in Swift können etwas knifflig sein … Sie können mehr darüber lesen,
  • Verwenden Sie diese Funktionen nicht, um zufällige Passwörter zu generieren – sie sind nicht sicher genug. Verwenden Sie einen Passwort-Manager wie LastPass stattdessen.
  • Seien Sie vorsichtig, wenn Sie zufällige IDs oder Schlüssel für Ihre Datenbank generieren, da es leicht zu einer Kollision kommen kann. Es ist besser, einen eindeutigen String-Generator wie UUID zu verwenden.
  • Eindrucksvoll! Wir haben eine ganze Menge zufälliger Dinge generiert. Folgendes haben wir besprochen:

    Table of Contents