Je suis principalement une tête Java, et je veux un moyen de générer un nombre pseudo-aléatoire entre 0 et 74. En Java, j'utiliserais la méthode:
Random.nextInt(74)
Je ne suis pas intéressé par une discussion sur les graines ou le vrai hasard, juste comment vous accomplissez la même tâche dans Objective-C. J'ai parcouru Google, et il semble qu'il y ait beaucoup d'informations différentes et contradictoires.
objective-c
random
rustyshelf
la source
la source
arc4random_uniform(x)
comme décrit ci-dessous par @yood. Il se trouve également dans stdlib.h (après OS X 10.7 et iOS 4.3) et donne une distribution plus uniforme des nombres aléatoires. Utilisationint r = arc4random_uniform(74);
Utilisez la
arc4random_uniform(upper_bound)
fonction pour générer un nombre aléatoire dans une plage. Les éléments suivants généreront un nombre compris entre 0 et 73 inclus.arc4random_uniform(upper_bound)
évite les biais modulo comme décrit dans la page de manuel:la source
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
si la vérification échoue, revenez à une autre solution.Comme C, vous feriez
(en supposant que vous vouliez inclure 0 mais exclure 74, ce que fait votre exemple Java)
Edit: Ne hésitez pas à remplacer
random()
ouarc4random()
pourrand()
( ce qui est, comme d' autres l' ont souligné, tout à fait sucky).la source
J'ai pensé pouvoir ajouter une méthode que j'utilise dans de nombreux projets.
Si je finis par l'utiliser dans de nombreux fichiers, je déclare généralement une macro
Par exemple
Remarque: Uniquement pour iOS 4.3 / OS X v10.7 (Lion) et versions ultérieures
la source
Cela vous donnera un nombre à virgule flottante compris entre 0 et 47
Ou tout simplement
Les limites inférieure et supérieure peuvent également être négatives . L'exemple de code ci-dessous vous donne un nombre aléatoire compris entre -35,76 et +12,09
Convertir le résultat en une valeur entière arrondie :
la source
drand48
plutôt des virgules flottantes.Selon la page de manuel de rand (3), la famille de fonctions rand a été obsolète par random (3). Cela est dû au fait que les 12 bits inférieurs de rand () passent par un modèle cyclique. Pour obtenir un nombre aléatoire, il suffit d'amorcer le générateur en appelant srandom () avec une graine non signée, puis d'appeler random (). Ainsi, l'équivalent du code ci-dessus serait
Vous n'aurez besoin d'appeler srandom () qu'une seule fois dans votre programme, sauf si vous souhaitez modifier votre graine. Bien que vous ayez dit que vous ne vouliez pas discuter de valeurs vraiment aléatoires, rand () est un assez mauvais générateur de nombres aléatoires, et random () souffre toujours d'un biais modulo, car il générera un nombre compris entre 0 et RAND_MAX. Par exemple, si RAND_MAX est 3 et que vous voulez un nombre aléatoire entre 0 et 2, vous êtes deux fois plus susceptible d'obtenir un 0 qu'un 1 ou un 2.
la source
Mieux à utiliser
arc4random_uniform
. Cependant, cela n'est pas disponible sous iOS 4.3. Heureusement, iOS liera ce symbole au moment de l'exécution, pas au moment de la compilation (alors n'utilisez pas la directive de préprocesseur #if pour vérifier s'il est disponible).La meilleure façon de déterminer si elle
arc4random_uniform
est disponible est de faire quelque chose comme ceci:la source
J'ai écrit ma propre classe d'utilité de nombres aléatoires juste pour que j'aie quelque chose qui fonctionne un peu plus comme Math.random () en Java. Il n'a que deux fonctions, et tout est fait en C.
En tête de fichier:
Fichier d'implémentation:
C'est une façon assez classique de générer des pseudo-aléas. Dans mon délégué d'application, j'appelle:
Plus tard, je dis simplement:
Notez que cette méthode renvoie un nombre aléatoire compris entre 0,0f (inclus) et 1,0f (exclusif).
la source
Il existe déjà d'excellentes réponses articulées, mais la question demande un nombre aléatoire compris entre 0 et 74. Utilisez:
arc4random_uniform(75)
la source
Depuis iOS 9 et OS X 10.11, vous pouvez utiliser les nouvelles classes GameplayKit pour générer des nombres aléatoires de différentes manières.
Vous avez le choix entre quatre types de sources: une source aléatoire générale (sans nom, jusqu'au système pour choisir ce qu'il fait), congruentielle linéaire, ARC4 et Mersenne Twister. Ceux-ci peuvent générer des ints, des flottants et des bools aléatoires.
Au niveau le plus simple, vous pouvez générer un nombre aléatoire à partir de la source aléatoire intégrée du système comme ceci:
Cela génère un nombre compris entre -2 147 483 648 et 2 147 483 647. Si vous voulez un nombre entre 0 et une limite supérieure (exclusive), vous utiliseriez ceci:
GameplayKit a des constructeurs de commodité intégrés pour fonctionner avec les dés. Par exemple, vous pouvez lancer un dé à six faces comme ceci:
De plus, vous pouvez façonner la distribution aléatoire en utilisant des choses comme
GKShuffledDistribution
.la source
Générez un nombre aléatoire entre 0 et 99:
Générez un nombre aléatoire entre 500 et 1000:
la source
// L'exemple suivant va générer un nombre compris entre 0 et 73.
Production:
nombre aléatoire: 72
nombre aléatoire étape 2:52
la source
Pour les développeurs de jeux, utilisez random () pour générer des aléas. Probablement au moins 5 fois plus rapide qu'avec arc4random (). Le biais Modulo n'est pas un problème, en particulier pour les jeux, lors de la génération d'aléas en utilisant la gamme complète de random (). Assurez-vous de semer en premier. Appelez srandomdev () dans AppDelegate. Voici quelques fonctions d'assistance:
la source