541 Stimmen

Wie generiere ich eine Zufallszahl in Swift?

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?

3voto

Zyphrax Punkte 17659

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 UInt8s 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 :)

2voto

Suhit Patil Punkte 11098

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

2voto

Priyank Patel Punkte 713

Xcode 14, swift 5

public extension Array where Element == Int {
    static func generateNonRepeatedRandom(size: Int) -> [Int] {
        guard size > 0 else {
            return [Int]()
        }
        return Array(0..

`

Verwendung:

let array = Array.generateNonRepeatedRandom(size: 15)
print(array)

Ausgabe

Bildbeschreibung eingeben

`

0voto

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]
    }
}

0voto

Durul Dalkanat Punkte 6880

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())

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X