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 ?
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 ?
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é.
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.
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 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.
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.