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?Aktualisierung
Meine ursprünglichen Kommentare darunter könnten von historischem Interesse sein, aber die Antwort seit Swift 4.2 ist die Verwendung von random(in:).
Ursprüngliche Kommentare
Ich möchte zu den vorhandenen Antworten hinzufügen, dass das Zufallszahlengenerator-Beispiel im Swift-Buch ein Linearer Kongruenz-Generator (LCG) ist, er ist stark eingeschränkt und sollte außer für die einfachsten Beispiele nicht verwendet werden, bei denen die Qualität der Zufälligkeit überhaupt keine Rolle spielt. Und ein LCG sollte niemals für kryptografische Zwecke verwendet werden.
arc4random()
ist viel besser und kann für die meisten Zwecke verwendet werden, aber auch hier sollte es nicht für kryptografische Zwecke verwendet werden.
Wenn Sie etwas haben möchten, das garantiert kryptografisch sicher ist, verwenden Sie SecCopyRandomBytes()
. Beachten Sie, dass wenn Sie einen Zufallszahlengenerator in etwas integrieren, jemand anderes ihn für kryptografische Zwecke (wie Passwort-, Schlüssel- oder Salzerzeugung) nutzen könnte, dann sollten Sie trotzdem die Verwendung von SecCopyRandomBytes()
in Betracht ziehen, selbst wenn Ihr Bedarf nicht unbedingt das erfordert.
Swift 4.2
Abschied von Import Foundation C lib arc4random_uniform()
// 1
let digit = Int.random(in: 0..<10)
// 2
if let anotherDigit = (0..<10).randomElement() {
print(anotherDigit)
} else {
print("Leerer Bereich.")
}
// 3
let double = Double.random(in: 0..<1)
let float = Float.random(in: 0..<1)
let cgFloat = CGFloat.random(in: 0..<1)
let bool = Bool.random()
- Sie verwenden random(in:), um zufällige Zahlen aus Bereichen zu generieren.
- randomElement() gibt nil zurück, wenn der Bereich leer ist, daher entpacken Sie das zurückgegebene Int? mit if let.
- Sie verwenden random(in:), um eine zufällige Double, Float oder CGFloat zu generieren, und random(), um einen zufälligen Bool zurückzugeben.
Ohne arc4Random_uniform() in einigen Versionen von Xcode (in 7.1 läuft es, aber es wird nicht automatisch vervollständigt für mich). Du kannst stattdessen das machen.
Um eine Zufallszahl von 0-5 zu generieren.
import GameplayKit
Dann
let diceRoll = GKRandomSource.sharedRandom().nextIntWithUpperBound(6)