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?

33voto

TwoStraws Punkte 12432

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.

24voto

Dave DeLong Punkte 240835

So können Sie es auf die gleiche Weise tun, wie Sie es in C tun würden:

let randomNumber = arc4random()

randomNumber wird als Typ UInt32 (eine 32-Bit vorzeichenlose Ganzzahl) interpretiert

23voto

Suragch Punkte 420096

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.

20voto

R.S Punkte 253

Beispiel für eine Zufallszahl zwischen 10 (0-9);

import UIKit

let zufallszahl = Int(arc4random_uniform(10))

Sehr einfacher Code - einfach und kurz.

17voto

Connor Punkte 62453

Ich konnte einfach rand() verwenden, um eine zufällige CInt zu erhalten. Sie können es zu einem Int machen, indem Sie so etwas verwenden:

let myVar: Int = Int(rand())

Sie können Ihre Lieblings-C-Zufallsfunktion verwenden und einfach den Wert bei Bedarf in einen Int umwandeln.

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