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?Der folgende Code erzeugt eine sichere Zufallszahl zwischen 0 und 255:
extension UInt8 {
public static var random: UInt8 {
var number: UInt8 = 0
_ = SecRandomCopyBytes(kSecRandomDefault, 1, &number)
return number
}
}
Du rufst es wie folgt auf:
print(UInt8.random)
Für größere Zahlen wird es komplizierter.
Das ist das Beste, was mir eingefallen ist:
extension UInt16 {
public static var random: UInt16 {
let count = Int(UInt8.random % 2) + 1
var numbers = [UInt8](repeating: 0, count: 2)
_ = SecRandomCopyBytes(kSecRandomDefault, count, &numbers)
return numbers.reversed().reduce(0) { $0 << 8 + UInt16($1) }
}
}
extension UInt32 {
public static var random: UInt32 {
let count = Int(UInt8.random % 4) + 1
var numbers = [UInt8](repeating: 0, count: 4)
_ = SecRandomCopyBytes(kSecRandomDefault, count, &numbers)
return numbers.reversed().reduce(0) { $0 << 8 + UInt32($1) }
}
}
Diese Methoden verwenden eine zusätzliche Zufallszahl, um zu bestimmen, wie viele UInt8
s verwendet werden, um die Zufallszahl zu erstellen. Die letzte Zeile konvertiert das [UInt8]
in UInt16
oder UInt32
.
Ich weiß nicht, ob die letzten beiden noch als wirklich zufällig gelten, aber du kannst es nach deinem Geschmack anpassen :)
Swift 4.2
Swift 4.2 hat eine native und ziemlich vollständige Zufallszahl-API in der Standardbibliothek enthalten. (Swift Evolution proposal SE-0202)
let intBetween0to9 = Int.random(in: 0...9)
let doubleBetween0to1 = Double.random(in: 0...1)
Alle Zahlentypen verfügen über das statische random(in:), das den Bereich akzeptiert und die Zufallszahl im angegebenen Bereich zurückgibt
Ich benutze diesen Code, um eine Zufallszahl zu generieren:
//
// FactModel.swift
// Collection
//
// Created by Ahmadreza Shamimi on 6/11/16.
// Copyright © 2016 Ahmadreza Shamimi. All rights reserved.
//
import GameKit
struct FactModel {
let fun = ["Ich liebe Swift","Mein Name ist Ahmadreza","Ich liebe das Coden","Ich liebe PHP","Mein Name ist Alireza","Ich liebe auch das Coden"]
func getRandomNumber() -> String {
let randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(fun.count)
return fun[randomNumber]
}
}
Sie können GeneratorOf
so verwenden:
var fibs = ArraySlice([1, 1])
var fibGenerator = GeneratorOf{
_ -> Int? in
fibs.append(fibs.reduce(0, combine:+))
return fibs.removeAtIndex(0)
}
println(fibGenerator.next())
println(fibGenerator.next())
println(fibGenerator.next())
println(fibGenerator.next())
println(fibGenerator.next())
println(fibGenerator.next())