Ich stelle fest, dass das Swift-Buch eine Implementierung eines Zufallszahlengenerators bereitgestellt hat. Ist es bewährte Praxis, diese Implementierung zu kopieren und einzufügen? Oder gibt es eine Bibliothek, die wir jetzt verwenden können?
Antworten
Zu viele Anzeigen?Ab iOS 9 können Sie die neuen GameplayKit-Klassen verwenden, um auf verschiedene Arten Zufallszahlen zu generieren.
Sie haben vier Quellentypen zur Auswahl: eine allgemeine Zufallsquelle (unbenannt, es liegt am System, was sie tut), lineare Kongruenz, ARC4 und Mersenne Twister. Diese können zufällige ints, floats und bools generieren.
Auf einfachster Ebene können Sie eine Zufallszahl aus der integrierten Zufallsquelle des Systems generieren, wie hier:
GKRandomSource.sharedRandom().nextInt()
Dies generiert eine Zahl zwischen -2.147.483.648 und 2.147.483.647. Wenn Sie eine Zahl zwischen 0 und einem oberen Grenzwert (ausschließlich) möchten, würden Sie dies verwenden:
GKRandomSource.sharedRandom().nextIntWithUpperBound(6)
GameplayKit verfügt über einige bequeme Konstruktoren, die mit Würfeln arbeiten. Zum Beispiel können Sie einen sechsseitigen Würfel so werfen:
let d6 = GKRandomDistribution.d6()
d6.nextInt()
Zusätzlich können Sie die Zufallsverteilung formen, indem Sie Dinge wie GKShuffledDistribution verwenden. Das erfordert etwas mehr Erklärung, aber wenn Sie interessiert sind, können Sie mein Tutorial zu GameplayKit Zufallszahlen lesen.
Verwenden Sie arc4random_uniform()
Verwendung:
arc4random_uniform(someNumber: UInt32) -> UInt32
Dies gibt Ihnen zufällige Ganzzahlen im Bereich von 0
bis someNumber - 1
.
Der maximale Wert für UInt32
beträgt 4.294.967.295 (das heißt, 2^32 - 1
).
Beispiele:
-
Münzwurf
let flip = arc4random_uniform(2) // 0 oder 1
-
Würfelwurf
let roll = arc4random_uniform(6) + 1 // 1...6
-
Zufälliger Tag im Oktober
let day = arc4random_uniform(31) + 1 // 1...31
-
Zufälliges Jahr in den 1990er Jahren
let year = 1990 + arc4random_uniform(10)
Allgemeine Form:
let number = min + arc4random_uniform(max - min + 1)
wo number
, max
und min
UInt32
sind.
Was ist mit...
arc4random()
Sie können auch eine Zufallszahl erhalten, indem Sie arc4random()
verwenden, der eine UInt32
zwischen 0 und 2^32-1 erzeugt. Um also eine Zufallszahl zwischen 0
und x-1
zu erhalten, können Sie diese durch x
dividieren und den Rest nehmen. Oder mit anderen Worten, verwenden Sie den Rest Operator (%):
let number = arc4random() % 5 // 0...4
Dies erzeugt jedoch eine leichte Modulo-Bias (siehe auch hier und hier), deshalb wird arc4random_uniform()
empfohlen.
Konvertieren zu und von Int
Normalerweise wäre es in Ordnung, so etwas zu tun, um zwischen Int
und UInt32
hin- und herzukonvertieren:
let number: Int = 10
let random = Int(arc4random_uniform(UInt32(number)))
Das Problem ist jedoch, dass Int
einen Bereich von -2.147.483.648...2.147.483.647
auf 32-Bit-Systemen und einen Bereich von -9.223.372.036.854.775.808...9.223.372.036.854.775.807
auf 64-Bit-Systemen hat. Vergleichen Sie dies mit dem Bereich von UInt32
von 0...4.294.967.295
. Das U
von UInt32
bedeutet unsigned.
Betrachten Sie die folgenden Fehler:
UInt32(-1) // negative Zahlen verursachen Integer-Überlauffehler
UInt32(4294967296) // Zahlen größer als 4.294.967.295 verursachen Integer-Überlauffehler
Stellen Sie also einfach sicher, dass Ihre Eingabeparameter im Bereich von UInt32
liegen und dass Sie keinen Ausgabewert benötigen, der außerhalb dieses Bereichs liegt.