vendredi 27 janvier 2012

Random Thoughts: rand () vs arc4random ()

Il ya plusieurs intégré d'aléas sur l'iPhone et la plupart des gens pensait première consiste à utiliser rand () après l'ensemencement en appelant

srandom(time(NULL));

Mais ... rand () n'est pas vraiment un PRNG très bon. random () est un peu mieux, mais toujours moins de idéales. Heureusement, ce ne sont pas les seuls disponibles sur l'iPhone. Personnellement, j'aime arc4random () parce que c'est une vie décente algorithme pseudo-aléatoire et a deux fois la portée ou de rand ().

Sur l'iPhone, RAND_MAX est 0x7fffffff (2147483647), tandis que arc4random () retourne une valeur maximale de 0x100000000 (4294967296), ce qui donne beaucoup plus de précision. Vous n'avez pas besoin de arc4random semences (), comme le premier appel à elle automatiquement graines.

Pour obtenir une valeur entière de arc4random () qui va de 0 à x-1, vous voulez faire cela:

int value = arc4random() % x;

Pour obtenir un nombre entier dans l'intervalle de 1 à x, il suffit d'ajouter 1:

int value = (arc4random() % x) + 1;

La parenthèse ne sont pas vraiment nécessaires basé sur l'ordre des règles de fonctionnement, mais je suis anale sujet parens.

Enfin, si vous avez besoin de générer un nombre à virgule flottante, définir ce dans votre projet:

#define ARC4RANDOM_MAX 0x100000000

Ensuite, vous pouvez utiliser arc4random () pour obtenir une valeur en virgule flottante (le double de la précision de l'aide rand ()), entre 0 et 100, comme ceci:

double val = floorf(((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);


Aucun commentaire: