C'est la solution la plus simple que j'ai pu trouver :
id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];
Il est nécessaire de vérifier count
car un non nil
mais vide NSArray
retournera 0
para count
y arc4random_uniform(0)
renvoie à 0
. Donc sans le contrôle, tu vas sortir des limites du tableau.
Cette solution est tentante mais elle est mauvais car cela provoquera un crash avec un tableau vide :
id object = array[arc4random_uniform(array.count)];
Pour référence, voici le documentation :
u_int32_t
arc4random_uniform(u_int32_t upper_bound);
arc4random_uniform() will return a uniformly distributed random number less than upper_bound.
La page de manuel ne mentionne pas que arc4random_uniform
renvoie à 0
quand 0
est passé comme upper_bound
.
Aussi, arc4random_uniform
est défini dans <stdlib.h>
mais en ajoutant le #import
n'était pas nécessaire dans mon programme de test iOS.
0 votes
Toutes les réponses sont correctes, mais pour une solution plus récente, voir ma réponse. ici . Il utilise le
arc4random_uniform
pour éviter le biais modulo.0 votes
Ce n'est pas une réponse à cette question, mais un point intéressant - d'autres collections de Foundation (NSSet NSHashTable) ont des méthodes "anyObject" qui lisent un objet arbitraire (aléatoire) à partir du Set/HashTable. On pourrait implémenter cette méthode dans une extension de NSArray, en suivant les suggestions ci-dessous.