J'essaie de créer un float aléatoire compris 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 mal?
Essaye ça:
(float)Rand() / Rand_MAX
Ou pour en avoir un entre 0 et 5:
float randomNum = ((float)Rand() / Rand_MAX) * 5;
Plusieurs façons de faire la même chose.
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;
}
essayer
float pscale = ((float)randn) / 100.0f;
Votre code fonctionne pour moi, il produit un nombre aléatoire compris entre 0,15 et 0,3 (à condition que je sème srandom()
). Avez-vous appelé srandom()
avant le premier appel à random()
? Vous devrez fournir à srandom()
une valeur entropique (beaucoup de gens n'utilisent que srandom(time(NULL))
).
Pour une génération de nombres aléatoires plus sérieuse, jetez un œil à arc4random
, qui est utilisé à des fins cryptographiques. Cette fonction de nombre aléatoire renvoie également un type entier, vous aurez donc toujours besoin de convertir le résultat en un type à virgule flottante.
Plus facile.
+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
return min + arc4random_uniform(max - min + 1);
}
Pour ajouter à la réponse de @ Caladain, si vous voulez que la solution soit aussi facile à utiliser que Rand()
, vous pouvez définir ces options:
#define randf() ((CGFloat)Rand() / Rand_MAX)
#define randf_scaled(scale) (((CGFloat)Rand() / Rand_MAX) * scale)
N'hésitez pas à remplacer CGFloat
par double
si vous n'avez pas accès à CoreGraphics.
Utiliser srandom () et Rand () n'est pas sûr lorsque vous avez besoin d'une vraie randomisation avec du sel float.
Sur MAC_10_7, IPHONE_4_3 et versions supérieures, vous pouvez utiliser arc4random_uniform (upper_bound) * . Cela permet de générer un entier entier aléatoire réel de 0 à * upper_bound *.
Donc, vous pouvez 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);