Angenommen, ich habe ein Array mit den Objekten 1, 2, 3 und 4. Wie würde ich ein zufälliges Objekt aus diesem Array auswählen?
objective-c
cocoa
Joshua
quelle
quelle
arc4random_uniform
Methode, um Modulo Bias zu vermeiden.Antworten:
@ Darryls Antwort ist richtig, könnte aber einige kleinere Änderungen gebrauchen:
Änderungen:
arc4random()
overrand()
undrandom()
ist einfacher, da kein Seeding (Aufrufsrand()
odersrandom()
) erforderlich ist .%
) verkürzt die Gesamtanweisung und macht sie gleichzeitig semantisch klarer.quelle
0 % 4 = 0
,1 % 4 = 1
,2 % 4 = 2
,3 % 4 = 3
,4 % 4 = 0
,5 % 4 = 1
... Falls Sie mit dem Modulo n , Ihr größten Ergebnis wird nie größer sein als n-1 .count
ist eine Eigenschaft:@interface NSArray<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> @property (readonly) NSUInteger count;
Dies ist die einfachste Lösung, die ich finden könnte:
Es ist zu prüfen ,
count
weil ein nichtnil
aber leerNSArray
zurückkehren wird0
fürcount
undarc4random_uniform(0)
kehrt0
. Ohne die Überprüfung werden Sie also die Grenzen des Arrays überschreiten.Diese Lösung ist verlockend, aber falsch, da sie einen Absturz mit einem leeren Array verursacht:
Als Referenz finden Sie hier die Dokumentation :
In der Manpage wird nicht erwähnt, dass
arc4random_uniform
zurückgegeben wird,0
wenn0
als übergeben wirdupper_bound
.Auch
arc4random_uniform
ist in definiert<stdlib.h>
, aber das Hinzufügen#import
war in meinem iOS-Testprogramm nicht notwendig.quelle
Vielleicht etwas in der Art von:
Vergessen Sie nicht, den Zufallszahlengenerator (z. B. srandomdev ()) zu initialisieren.
HINWEIS: Ich habe gemäß der folgenden Antwort die Verwendung von -count anstelle der Punktsyntax aktualisiert.
quelle
Bearbeiten: Aktualisiert für Xcode 7. Generika, Nullbarkeit
quelle
Generieren Sie eine Zufallszahl und verwenden Sie sie als Index. Beispiel:
quelle
SecRandomCopyBytes()
auf dem iPhone ohnehin kryptografisch nützliche Zufallszahlen abrufen . Auf dem Mac haben Sie direkten Zugriff auf / dev / random.Inx ist die Zufallszahl.
Dabei kann srand () an einer beliebigen Stelle im Programm vor der Zufallsauswahlfunktion stehen.
quelle
Wenn Sie dies in ein int umwandeln möchten, finden Sie hier die Lösung dafür (nützlich, wenn Sie ein zufälliges int aus einem Array nicht sequentieller Zahlen benötigen, wenn Sie einen Aufzählungsaufruf randomisieren usw.).
quelle
In Swift 4:
quelle