34 votes

Comment créer un flottant aléatoire en Objective-C ?

J'essaie de créer un flottant aléatoire entre 0.15 et 0.3 en Objective-C. Le code suivant renvoie toujours 1 :

int randn = (random() % 15)+15;
float pscale = (float)randn / 100;

Qu'est-ce que je fais de travers ?

0 votes

Ce code semble fonctionner, mais l'utilisation de 100.0f est préférable. Le seul cas que je puisse imaginer est que vous mettez ce code dans une fonction et que vous ne le déclarez pas dans .h, de sorte que le compilateur pourrait le transformer en double.

67voto

Boris Points 379

Voici une fonction

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
    float diff = bigNumber - smallNumber;
    return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
}

14 votes

define boris_random(smallNumber, bigNumber) ((((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * (bigNumber - smallNumber)) + smallNumber)

0 votes

@chunkyguy, Pourriez-vous réécrire cette réponse en utilisant arc4random_uniform ?

21voto

Caladain Points 3408

Essayez ceci :

 (float)rand() / RAND_MAX

Ou d'en obtenir un entre 0 et 5 :

 float randomNum = ((float)rand() / RAND_MAX) * 5;

Plusieurs façons de faire la même chose.

20 votes

Ce n'est pas le cas. random() / RAND_MAX ne vous donnera pas une valeur en virgule flottante car aucune valeur n'est en virgule flottante. De plus, le domaine de random() n'est pas compris entre 0 et RAND_MAX. Le domaine de rand() y rand_r() est. Vous devez donc utiliser : (float)rand() / RAND_MAX pour obtenir le résultat escompté.

1 votes

C'est faux (rand()/RAND_MAX) vous donnera un zéro. Le commentaire de Jonathan est vrai.

4voto

Lou Franco Points 48823
  1. utilisez arc4random() ou seedez vos valeurs aléatoires
  2. essayer

    float pscale = ((float)randn) / 100.0f;

3voto

dreamlax Points 47152

Votre code fonctionne pour moi, il produit un nombre aléatoire entre 0,15 et 0,3 (à condition que j'ensemence avec srandom() ). Avez-vous appelé srandom() avant le premier appel à random() ? Vous devez fournir srandom() avec une certaine valeur entropique (beaucoup de gens utilisent simplement srandom(time(NULL)) ).

Pour une génération de nombres aléatoires plus sérieuse, jetez un coup d'œil à arc4random qui est utilisé à des fins cryptographiques. Cette fonction de nombres aléatoires renvoie également un type d'entier, de sorte que vous devrez toujours convertir le résultat en un type de virgule flottante.

0voto

malex Points 2992

L'utilisation de srandom() et rand() n'est pas sûre lorsque vous avez besoin d'une vraie randomisation avec un sel flottant.

Sur MAC_10_7, IPHONE_4_3 et plus, vous pouvez utiliser arc4random_uniform(upper_bound)*. Il permet de générer des nombres entiers aléatoires vrais de zéro à *upper_bound*.

Vous pouvez donc essayer ce qui suit

u_int32_t upper_bound = <some big enough integer>;

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X