Ich bin hauptsächlich ein Java-Kopf und möchte eine Möglichkeit finden, eine Pseudozufallszahl zwischen 0 und 74 zu generieren. In Java würde ich die Methode verwenden:
Random.nextInt(74)
Ich bin nicht an einer Diskussion über Samen oder echte Zufälligkeit interessiert, nur wie Sie dieselbe Aufgabe in Ziel-C erfüllen. Ich habe Google durchsucht und es scheint nur viele verschiedene und widersprüchliche Informationen zu geben.
objective-c
random
rostig
quelle
quelle
arc4random_uniform(x)
wie unten von @yood beschrieben. Es befindet sich auch in stdlib.h (nach OS X 10.7 und iOS 4.3) und bietet eine gleichmäßigere Verteilung der Zufallszahlen. Verwendungint r = arc4random_uniform(74);
Verwenden Sie die
arc4random_uniform(upper_bound)
Funktion, um eine Zufallszahl innerhalb eines Bereichs zu generieren. Im Folgenden wird eine Zahl zwischen 0 und einschließlich 73 generiert.arc4random_uniform(upper_bound)
vermeidet Modulo Bias wie in der Manpage beschrieben:quelle
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
Wenn Sie ältere Geräte unterstützen, sollten Sie eine Prüfung hinzufügen: Wenn die Prüfung fehlschlägt, greifen Sie auf eine andere Lösung zurück.Genau wie C würden Sie tun
(Angenommen, Sie wollten 0 einschließen, aber 74 ausschließen, was in Ihrem Java-Beispiel der Fall ist.)
Edit: Fühlen Sie sich frei zu ersetzen
random()
oderarc4random()
fürrand()
(die, wie andere haben darauf hingewiesen, ganz sucky).quelle
Ich dachte, ich könnte eine Methode hinzufügen, die ich in vielen Projekten verwende.
Wenn ich es in vielen Dateien verwende, deklariere ich normalerweise ein Makro als
Z.B
Hinweis: Nur für iOS 4.3 / OS X 10.7 (Lion) und höher
quelle
Dadurch erhalten Sie eine Gleitkommazahl zwischen 0 und 47
Oder einfach nur
Sowohl die untere als auch die obere Grenze können ebenfalls negativ sein . Der folgende Beispielcode gibt Ihnen eine Zufallszahl zwischen -35,76 und +12,09
Konvertieren Sie das Ergebnis in einen runderen Integer- Wert:
quelle
drand48
stattdessen für Gleitkommazahlen.Laut der Handbuchseite für rand (3) wurde die rand-Funktionsfamilie zufällig (3) überholt. Dies liegt an der Tatsache, dass die unteren 12 Bits von rand () ein zyklisches Muster durchlaufen. Um eine Zufallszahl zu erhalten, setzen Sie einfach den Generator, indem Sie srandom () mit einem vorzeichenlosen Startwert aufrufen, und rufen Sie dann random () auf. Das Äquivalent des obigen Codes wäre also
Sie müssen srandom () nur einmal in Ihrem Programm aufrufen, es sei denn, Sie möchten Ihren Startwert ändern. Obwohl Sie sagten, Sie wollten keine Diskussion über wirklich zufällige Werte, ist rand () ein ziemlich schlechter Zufallszahlengenerator, und random () leidet immer noch unter Modulo Bias, da es eine Zahl zwischen 0 und RAND_MAX erzeugt. Wenn also RAND_MAX 3 ist und Sie eine Zufallszahl zwischen 0 und 2 möchten, ist die Wahrscheinlichkeit, dass Sie eine 0 als eine 1 oder eine 2 erhalten, doppelt so hoch.
quelle
Besser zu benutzen
arc4random_uniform
. Dies ist jedoch unter iOS 4.3 nicht verfügbar. Glücklicherweise bindet iOS dieses Symbol zur Laufzeit und nicht zur Kompilierungszeit (verwenden Sie also nicht die Präprozessor-Direktive #if, um zu überprüfen, ob es verfügbar ist).Der beste Weg, um festzustellen, ob
arc4random_uniform
verfügbar ist, besteht darin, Folgendes zu tun:quelle
Ich habe meine eigene Zufallszahlen-Dienstprogrammklasse geschrieben, damit ich etwas habe, das ein bisschen mehr wie Math.random () in Java funktioniert. Es hat nur zwei Funktionen und alles ist in C hergestellt.
Header-Datei:
Implementierungsdatei:
Es ist eine ziemlich klassische Art, Pseudo-Zufälle zu erzeugen. In meinem App-Delegaten rufe ich an:
Dann später sage ich einfach:
Beachten Sie, dass diese Methode eine Zufallszahl zwischen 0.0f (einschließlich) und 1.0f (exklusiv) zurückgibt.
quelle
Es gibt bereits einige gute, artikulierte Antworten, aber die Frage fragt nach einer Zufallszahl zwischen 0 und 74. Verwendung:
arc4random_uniform(75)
quelle
Ab iOS 9 und OS X 10.11 können Sie die neuen GameplayKit-Klassen verwenden, um Zufallszahlen auf verschiedene Arten zu generieren.
Sie haben vier Quelltypen zur Auswahl: eine allgemeine Zufallsquelle (unbenannt, bis auf das System, um auszuwählen, was sie tut), linear kongruent, ARC4 und Mersenne Twister. Diese können zufällige Ints, Floats und Bools erzeugen.
Auf der einfachsten Ebene können Sie eine Zufallszahl aus der integrierten Zufallsquelle des Systems wie folgt generieren:
Das ergibt eine Zahl zwischen -2.147.483.648 und 2.147.483.647. Wenn Sie eine Zahl zwischen 0 und einer Obergrenze (exklusiv) möchten, verwenden Sie Folgendes:
GameplayKit verfügt über einige praktische Konstruktoren, die für die Arbeit mit Würfeln integriert sind. Zum Beispiel können Sie einen sechsseitigen Würfel wie folgt würfeln:
Außerdem können Sie die zufällige Verteilung mithilfe von Dingen wie gestalten
GKShuffledDistribution
.quelle
Zufallszahl zwischen 0 und 99 generieren:
Zufallszahl zwischen 500 und 1000 generieren:
quelle
// Das folgende Beispiel generiert eine Zahl zwischen 0 und 73.
Ausgabe:
Zufallszahl: 72
Zufallszahl Schritt 2: 52
quelle
Verwenden Sie für Spieleentwickler random (), um Zufälle zu generieren. Wahrscheinlich mindestens 5x schneller als mit arc4random (). Die Modulo-Verzerrung ist insbesondere bei Spielen kein Problem, wenn Zufälle mit dem gesamten Bereich von random () generiert werden. Achten Sie darauf, zuerst zu säen. Rufen Sie srandomdev () in AppDelegate auf. Hier sind einige Hilfsfunktionen:
quelle